Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Вопрос: Разгоняем CHR : Почти в 2 раза!
Добавлено: 08.05.05 22:08
Автор вопроса: Morpheus | Web-сайт:
Ответы
Всего ответов: 125
Номер ответа: 16
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #16
Добавлено: 10.05.05 09:17
Я не ляпнул, оно действительно медленней. Я вообще ни слова не говорил про Chr vs Array, я те сказал что дурной тон это именно использовать имена счетчиков. И ты не прав.
И не нарывайся на грубость, пусть оно и запрещено, но тя оскорбить - могу и не удержаться.
Номер ответа: 17
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #17
Добавлено: 10.05.05 11:22
Я использую Next всегда с именем счётчика. Исключительно для упорядоченности. А когда делаю проверку кода и нахожу пустой Next, то обязательно поставлю после него имя переменной.
Отлавливать такие ошибки очень тяжело и лучше сразу же исключить возможность их появления.
Номер ответа: 18
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #18
Добавлено: 10.05.05 11:59
Dim s As String
s = Chr(j)
s = c(j)
Такое возможно только в VB, который автоматически преобразовывает источник в формат приёмника. Кроме того не следует забывать что функция CHR расчитана на тип Variant и к ней больше подходит объявление без явного указания типа. А то что оборачивание операций в функцию замедляет работу и так ясно. Нужно как минимум выполнить CALL и RET.
Номер ответа: 19
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #19
Добавлено: 10.05.05 12:40
Кстати, вот такой тест не показал разницы во времени:
Private Sub Form_Load()
Dim B As Long, t1 As Double, t2 As Double
MsgBox "Start!", 48
t1 = Timer
For B = 0 To 1000000000
Next B
t2 = Timer
MsgBox t2 - t1, , "Next B"
t1 = Timer
For B = 0 To 1000000000
Next
t2 = Timer
MsgBox t2 - t1, , "Next"
End Sub
Номер ответа: 20
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #20
Добавлено: 10.05.05 12:47
И в этом тесте оба цикла отработали с одинаковой скоростью:
Private Sub Form_Load()
Dim A As Long, B As Long, C As Long, t1 As Double, t2 As Double
MsgBox "Start!", 48
t1 = Timer
For C = 0 To 1000
For B = 0 To 1000
For A = 0 To 1000
Next A
Next B
Next C
t2 = Timer
MsgBox t2 - t1, , "Next Counter"
t1 = Timer
For C = 0 To 1000
For B = 0 To 1000
For A = 0 To 1000
Next
Next
Next
t2 = Timer
MsgBox t2 - t1, , "Next"
End Sub
Номер ответа: 21
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #21
Добавлено: 10.05.05 13:32
sne, не надо мне угрожать грубостями.
На фоне того, что ты ошибаешься, твои угрозы выглядят как минимум смешно.
Понятно, что я тут человек новый, и тебя заклинило на том, что посмел не согласиться с лидером. Но CyRax тут вроде не новичок, может его мнение для тебя имеет больше вес? Может ты ему поверишь, что цикл с переменной и без неё работают одинаково? Раз сам не в состоянии набрать пару строк и проверить.
И всё-таки отсутствие переменной цикла - дурной стиль, и если ты его придерживаешься, то тебе надо самоучитель VB в руки и вперед, переучиваться.
Если тебе нечего сказать по теме топика, не надо засорять его и провоцировать бесконечный флуд, вынуждая меня отвечать тебе.
Номер ответа: 22
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #22
Добавлено: 10.05.05 13:47
Мне тоже это интересно и я был очень недоволен когда впервые услышал это утверждение. Правда тогда я поверил на слово и удосужился проверить только сейчас.
Всё же если это так принципиально, то лучше всего сравнить генерируемые компилятором инструкции.
Номер ответа: 23
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #23
Добавлено: 10.05.05 15:04
С переменной цикла:
Dim i As Long
For i = 0 To 100
Next i
End Sub
00401552 > 83C0 01 ADD EAX,1
00401555 . 70 06 JO SHORT 1.0040155D
00401557 . 83F8 64 CMP EAX,64
0040155A .^7E F6 JLE SHORT 1.00401552
0040155C . C3 RETN
0040155D > FF15 40104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaError>; MSVBVM60.__vbaErrorOverflow
-------------------------------
Без переменной цикла:
Dim i As Long
For i = 0 To 100
Next
End Sub
00401552 > 83C0 01 ADD EAX,1
00401555 . 70 06 JO SHORT 1.0040155D
00401557 . 83F8 64 CMP EAX,64
0040155A .^7E F6 JLE SHORT 1.00401552
0040155C . C3 RETN
0040155D > FF15 40104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaError>; MSVBVM60.__vbaErrorOverflow
Здесь два листинга. Один с указанием переменной, другой - без.
Может, уважаемый sne объяснит, по какой причине первый код должен исполняться медленнее второго, а?
Номер ответа: 24
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #24
Добавлено: 10.05.05 15:25
Что то не нравится мне VB-шный пустой цикл. Хотя наверное если отключить проверку на переполнение он сгенерирует более оптимизированный код.
Номер ответа: 25
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #25
Добавлено: 10.05.05 15:49
Найди в себе силы и укажи в каком месте я ошибся?
Ты лучше посмотри на свой тон. И узнаешь что меня нервирует
Что его мнение, что мое, что твое равны. Но вас одно обобщает Вы идете спорить и обвинять недочитав фразы
Я набирал, проверял. В IDE цикл с указанным счетчиком работает медленнее, это факт! И хватит отрицать очевидное, возьми напиши пару строк и проверь!!!
Или до тебя настолько туго доходят чужие слова!?
Нифига не дурной Написание счетчика - вот дурной стиль, имхо )
А знаешь в чем разница меж нами, я указываю что высказаное мной лишь мое скромное мнение, а ты гнешь линию и не думаешь что это твое, а не общее!
Может, уважаемый sne объяснит, по какой причине первый код должен исполняться медленнее второго, а?
Мдя... Как ты наверное понял, я прекрасно могу пользоваться (в данном случае ты юзал Olly) отладчик и дизасемблер. И первым же делом я дизассемблил код и смотрел. Я уже сто раз написал про IDE, а ты либо слеп, либо туп, прости за искренность, но выбирай одно из двух. Мне уже надоело сто раз повторять одно и то же из раза в раз.
Вот тебе пример, у тебя есть MsgBox, причем в IDE он имеет прототип:
MsgBox [owner, lpText, lpCaption, dwState]
А в откомпилированном exe:
MsgBox [owner, lpCaption, lpText, dwState]
Ты бы этого хотел!?
Тут та же ситуация, в IDE Next i работает по-другому, не так как в откомпилированном варианте. Суть надеюсь донес.
Так зачем же использовать разное, когда можно указать просто Next - и форма записи короче, и стабильность.
Номер ответа: 26
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #26
Добавлено: 10.05.05 15:50
2CyRax
Я отключал, все едино
Номер ответа: 27
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #27
Добавлено: 10.05.05 16:17
Я уже говорил, что ссылки на IDE неуместны. Не тестируют программы на скорость в IDE. Если это для тебя откровение - остается развести руками.
Не поленился и набрал этот код. И запустил в IDE.
Dim i As Long, t As Single
t = Timer
For i = 0 To 100000000
Next i
MsgBox Timer - t
End Sub
Private Sub cmd2_Click()
Dim i As Long, t As Single
t = Timer
For i = 0 To 100000000
Next
MsgBox Timer - t
End Sub
СПЕЦИАЛЬНО ОГОВАРИВАЮ: ЗАПУСКАЛ ИЗ IDE.
ОБА СПОСОБА ПОКАЗАЛИ ОДИНАКОВЫЙ РЕЗУЛЬТАТ 1,79 сек.
Ты и теперь будешь отрицать? Может ты хотя бы в этот раз объяснишь, почему одинаковый результат, не сбиваясь на угрозы и сотрясание воздуха кулаками?
Знаешь приятель, ты не удосужился даже проверить свои слова. Это называется пустозвонство.
Какие ещё можешь придумать причины или условия для оправдания своей некомпетентности?
Жду следующих нападок
Номер ответа: 28
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #28
Добавлено: 10.05.05 16:21
Знаешь чем я отличаюсь от тебя? Тем что могу признать свои ошибки. Ты же не можешь найти в себе силы сделать этого.
Слабак
Номер ответа: 29
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #29
Добавлено: 10.05.05 16:30
Нет, ну вообще то скорость работы в IDE важна. Она важна для VBA, т.к. они (VB6 IDE и VBA) используют один и тот же движок.
Остаётся только проверить действительно ли в IDE другой код для данного случая. Самый простой способ проверки - получить адрес процедуры с тестовым кодом с помощью AddressOf и считать оттуда память в файл (тут зависит от прав доступа: либо CopyMemory либо ReadProcessMemory). Потом скармливаешь этот код дизассемблеру (например WDASM) и получаешь код цикла.
Номер ответа: 30
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #30
Добавлено: 10.05.05 17:13
Знаешь чем я отличаюсь от тебя? Тем что могу признать свои ошибки. Ты же не можешь найти в себе силы сделать этого.
Слабак
Об этой его слабости всем известно. Ты не открыл америку .