|
|
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Привет! Всегда, когда необходимо узнать есть ли в строке тот или иной символ, программеры прибегают к AT(SearchFor,SearchIn) =/<>/> 0 и практически никогда не видел SearchFor $ SearchIn. Почему? По-моему второй вариант предпочтительнее, т.к. во-первых производится 1 действие, во-вторых не вычисляется позиция вхождения искомого в искомом, соотв. он в разы быстрее, хотя это и не важно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2008, 16:07 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
AT() читабельнее и более функциональный. Зачем использовать две конструкции если возможности одной полностью содержат вторую? CTAC-KOво-вторых не вычисляется позиция вхождения искомого в искомом, соотв. он в разы быстрее, хотя это и не важно. Вычисляется, только не возвращается, раз найдено вхождение значит и положение его известно. Насчет "в разы" тоже загнул, померил бы предварительно прежде чем писать :), основные затраты времени на поиск уходят, а не на сравнение с нулем. Думаю разница по времени незначительна. Я лично обычно предпочитаю такую конструкцию: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2008, 16:19 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Функция $ ведет поиск с учетом регистра (прописные и строчные символы различаются) и не допускает оптимизацию по технологии Rushmore . Поиск, осуществляемый функцией AT( ), ведется с учетом регистра. Чтобы выполнить поиск без учета регистра, воспользуйтесь функцией ATC( ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2008, 16:20 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Лично предпочитаю ATC() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2008, 16:21 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Раз получается так, что функция $ не поддается RushMore Optimization, чего про AT()/ATC() не сказано, то скорее всего в вфп это совершенно отдельные подпрограммы, поэтому, думаю, позиция там специально не вычисляется. Разве что чисто как переменная цикла, в котором просматриваются данные... RushMore Optimization я всегда думал касается только работы с бд. При чем здесь, интересно работа функции и почему про AT()/ATC() не сказано, что они таки поддаются RushMore-у? Типа по-умолчанию поддается? Или имеется ввиду работа с бд с использованием $, когда, к примеру, накладывается фильтр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 15:11 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Dima TНасчет "в разы" тоже загнул, померил бы предварительно прежде чем писать :) по предварительном тестам $ самая быстрая, незначительно, правда, опережая АТ, а вот ATC - самая медленная. При этом я рассматриваю случай, когда необходимо просто установить - есть ли искомое в искомом, т.е. для задач когда не важно где оно находится. Искал не букву и не слово, а символ $, т.е. регистр ни при чем. Сейчас провожу тест по-дольше, чтобы разница была по-ощутимее, текст теста такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 16:11 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Я конечно сильно извратился, прошу не пинать, однако вот результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 17:08 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
CTAC-KO Dima TНасчет "в разы" тоже загнул, померил бы предварительно прежде чем писать :) по предварительном тестам $ самая быстрая, незначительно, правда, опережая АТ, а вот ATC - самая медленная. Погонял твой тест (один миллион только в цикл поставил, файл 30 кб, символ "$" 1905-й): AT() - 10.10 сек ATC() - 68 сек $ - 10.05 сек Т.е. $ на 0,5% быстрее AT(), и в 7 раз быстрее ATC() Еще одно маленькое открытие сделал: AT(lower(lcC),lower(m.lsString)) равнозначно по времени AT(lcC,m.lsString) Вывод: 0,5% (точнее 50000 мксек / 1000000 = 0,05 микросекунды) очень незначительная величина. На самом деле чуть больше в % и чуть меньше в мсек, т.к. на остальные операторы тоже время тратилось. ЗЫ Вот это зачем в цикл воткнул? Код: plaintext Если уж сильно надо вывод, то тогда так примерно вставляй: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 17:18 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Еще поизвращался: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. $_____56, 58, 56 AT()__65, 65, 68 ATC()_73, 75, 73 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 17:37 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
GoshaSЯ конечно сильно извратился, прошу не пинать, однако вот результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. А что неожиданного увидел? Помоему закономерно что $ быстрее AT(), тот быстрее ATC() и LIKE самый медленный. Сложность возрастает (функционал команд) - время увеличивается. Неожиданно что like('*15^*', a1) чуть быстрее like '%15^%' Если неожиданность в GoshaSФункция $ ведет поиск с учетом регистра (прописные и строчные символы различаются) и не допускает оптимизацию по технологии Rushmore . То все перечисленные команды не допускают оптимизации. Оптимизация возможна только при наличии индекса (у тебя его нет кстати) и только тогда когда этим индексом можно воспользоваться. Для приведенных конструкций нет такого алгоритма чтобы индекс применить можно было, поэтому везде идет простой скан таблицы. Если бы был индекс по a1 и выражение "WHERE a1 like '15^%'" тогда бы оптимизатор подключился. DATETIME() на SECONDS() замени, точнее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 17:45 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
итак, по приведенному коду, ($ at 15984/18238), результаты такие: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 17:58 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Dima TЗЫ Вот это зачем в цикл воткнул? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 18:08 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 18:10 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
GoshaSВсе равно $ впереди всех Это изначально и предполагалось, вопрос был насколько впереди. CTAC-KOитак, по приведенному коду, ($ at 15984/18238), результаты такие: Код: plaintext 1. 2. Чтобы вывод статуса проигнорировать мерим разницу в секундах: (1315.472 - 1222.698) / 10000000 = 9,2774 микросекунды Значительная разница получилась с моими данными (0,05 микросекунды). Передвинул у себя '$' почти в конец файла, несоклько раз запускал - молотит дольше, но разница такая же ~0,05 мксек. Подождем что у тебя без статусбара получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 18:37 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
без статусбара получилось: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 20:10 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext а разница получилась ~5 вместо 93, как в предидущем случае. однако это на 1^10 меньше, т.е. вместо 9.3 мксек, вышло 0,5 мксек, но не 0,05. Мож с порядком де-то что-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 20:20 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
да, забыл отметить, что прошлый раз я запустил ехе-шнег прямо с флешки, а этот раз скопировал все в корень С: и уже оттедова... возможно это тоже повлияло.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 20:26 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Dima T Еще одно маленькое открытие сделал: AT(lower(lcC),lower(m.lsString)) равнозначно по времени AT(lcC,m.lsString)надо будет проверить сие относительно $. Но вообще, если говорить о регистрозависимых функциях, то следует, сравнивать именно $ и ATC() - и тут-то, конечно, сравнение далеко не в пользу последнего... Странно, если позиция в подпрограмме ф-ции $ действительно вычисляется, но не возвращается, то чего такая разница, ведь АТС() = $ + возврат позиции? Тут же как в инвайте - просто добавь воды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 20:37 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
ой, блин, перепутал все. АТ - регистрозависимая как и $, так что их и надо было сравнивать, что мы и сделали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 20:39 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
CTAC-KO Dima T Код: plaintext а разница получилась ~5 вместо 93, как в предидущем случае. однако это на 1^10 меньше, т.е. вместо 9.3 мксек, вышло 0,5 мксек, но не 0,05. Мож с порядком де-то что-то? Это больше на правду похоже :) Насчет порядка: у меня 0.05 сек разницы на миллион операций Вполне возможно что 0.5-0.05 из-за разных процессоров и погрешностей измерения. Даже при 0.5 чтобы одну секунду выиграть должно быть менее 2 млн. расчетов, а это очень много, потеряется эта секунда во всем остальном в таком большом расчете. Что и требовалось доказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2008, 20:50 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
Так точно, ЧТД! Стало быть на строковых операциях, где важно узнать о факте вхождения икомого в искомом, критерием выбора может служить лишь личное предпочтение (по-мне лучше бакс :) - т.к. ён короче), а если необходима дальнейшая обработка учитывая позицию вхождения, то конечно же АТ() (+, по необходимости, LOWER/UPPER), вместо ATC(), причем в конструкции с переменной, дабы не выполнять один и тот же АТ дважды. А вот судя по тестам GoshaS, на SQL-выборках отставание АТ от $ более заметно, так что ежели нет индексов, могущих это дело RushMore-ить, то по скорости предпочтительнее всего будет все-таки $. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2008, 13:57 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
авторПривет! Всегда, когда необходимо узнать есть ли в строке тот или иной символ, программеры прибегают к AT(SearchFor,SearchIn) =/<>/> 0 и практически никогда не видел SearchFor $ SearchIn. Почему? По-моему второй вариант предпочтительнее, т.к. во-первых производится 1 действие, во-вторых не вычисляется позиция вхождения искомого в искомом, соотв. он в разы быстрее, хотя это и не важно. Это делают те же самые индусы, которые могут написать alltrim(str(m.lN)) вместо trim(str(m.lN)), или даже alltrim("Константа") (видел и такое)! Они же пишут, например: if m.lN=1 ... endif if m.ln=2 ... endif - это, как вы поняли, вместо case. (Не стоит думать, что это редкая патология). Они же пишут "where lfield=.T.", (вариант: "where not lfield==.F."). Они же пишут... э-э... сейчас открою один из проектов, которые приходится сопровождать... вот, долго искать не пришлось: if !found() return endif if found() ... && еще кучка повидла endif и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2008, 18:21 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
GlybaЭто делают те же самые индусы, которые могут написать alltrim(str(m.lN)) ну такю конструкцию я и сам долго использовал, а затем перешел на LTrim(str(m.lN)), а соврешенно недавно перешел на TRANSFORM(m.lN) честно признаюс_ ребята, я - индус! к сожалению наше текущее поколение цивилизации лишено возможности рождаться сразу со знаниями, или нести опыт предыдущих жизней, мы знания и опыт вынуждены обретать по жизни каждое рождение с нуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 02:10 |
|
||
|
Интересно, а почему используют AT(SearchFor,SearchIn) а не SearchFor$SearchIn
|
|||
|---|---|---|---|
|
#18+
автормы знания и опыт вынуждены обретать по жизни каждое рождение с нуля. Это так, но кто-то в самом деле обретает знания и опыт (кто-то даже хороший вкус!), а "индусов", видимо, можно определить как тех, кого ничто не побуждает развиваться. Вроде бы не заслуживает внимания, правда: alltrim(str(m.lN)) или trim(str(m.lN)), $ или at(). Или даже atcline() используют, чтобы определить, входит ли одна строка в другую (сам видел). Но! Такой код создает впечатление, что писавший его не слишком задумывался о том, что он пишет. Локально, правда. Но в таких случаях оказывается, что и глобально там не все хорошо, в этом проекте. Так что с точки зрения "работает / не работает" все равно, использовать $ или at(). Но это симптом. Всякого я насмотрелся, поэтому считаю себя вправе так говорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 08:57 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35421698&tid=1587538]: |
0ms |
get settings: |
12ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 433ms |

| 0 / 0 |
