![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Sleepy_PIP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
кстати я был не прав. в большинстве прямо компилирующихся языков под любой платформой sin(cos, tg, и так далее) будет превращаться в первую очередь в вызов библиотечной. ф., а та уже в свою очередь задействует сопроцессор. что явно больше времени доступа к массиву даже с предвычислением индекса. да.
-------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
| Sleepy_PIP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
объясните пожалуста. почему деление путем вычитания быстрее натурального деления?
вот код:
вот результат: del by minus 16 milliseconds del by del 62 milliseconds все-ж - от чего так происходит? само деление - уже не вызов метода - это оператор, который вполне может быть выполнен на сопроцессоре, как в прочем и приведение типа. Однако как сказад DomesticCat - так оно и получается, деление путем вычитания быстрее Спасибо! PS: что еще интересно - результат в ll для ll/=5000; всегда будет 0. ... Это сообщение отредактировал(а) Sleepy_PIP - 27.11.2004, 19:18 -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
| Domestic Cat |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Ну не настолько же быстрее Просто у тебя ошибка: после первого прохода цикла
ll становится равным 0. Тогда все оставшиеся 999999 раз этот цикл пропускается. Во втором с,лучае ноль получается из-за того, что ты делишь 45000 на 5000 1000000 раз. После девятого деления ll становится равным 1, а 1/5000 дает 0, т.к. оба числа целые и выполняется целочисленное деление (остаток = 1, результат = 0) . Я сделал так:
и получил:
то есть скорость приблизительно одинакова. -------------------- |
||||||||
|
|||||||||
| Sleepy_PIP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
Спасибо. ошибку я проглядел
а вот дельфевый код
выполняется в более чем 10 раз быстрее для деления. Правда тут есть одна тонкость - результат деления засовывается в вещественную переменную ... Это сообщение отредактировал(а) Sleepy_PIP - 27.11.2004, 20:27 -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
| Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Ну, Делфи я не знаю, так что сказать не могу ничего. Если изменить так в Java коде:
то замедление незначительное: 330 мс против 390 мс. -------------------- |
||||
|
|||||
| Sleepy_PIP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
сделал аналог дельфевому коду, с исправлением ошибок
но результаты все равно я не понимаю: del by minus 47 milliseconds del by del 93 milliseconds правда тут может влиять ll=45000; в цикле. неужели из-а этого? нет, не из-а этого. закоментаринивание в цикле ll=45000; дает все равно: del by minus 47 milliseconds del by del 94 milliseconds учусь! и еще на долго ... -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Ну деление-то остается делением, оно все-таки медленнее
а конвертация - медленная штука. Это сообщение отредактировал(а) Domestic Cat - 27.11.2004, 20:46 -------------------- |
|||
|
||||
| Sleepy_PIP |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
сории, я еще не освоил дизасм (или как там в яве?) - не мог-бы ты привести во что выражается в байткоде вычитание и деление? случаем не в вызовы методов? Сильно похоже что jvm действительно не использует сопроцессор вообще ... только догадки ... Добавлено @ 20:46
дело в том, что конвертацией так-же может заведовать сопроцессор ... но увы и ах, я так и не понимаю на чем теряется время .... -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
||||||
|
|||||||
| Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
конвертацией занимается JVM, опкод l2d (в данном случае)
опкоды lsub и ldiv (для лонгов). Все это ни о чем не говорит, т.к. JVM всегда вызывает методы ОС, она не работает с процессором напрямую. Это сообщение отредактировал(а) Domestic Cat - 27.11.2004, 20:51 -------------------- |
||||
|
|||||
| Sleepy_PIP |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
ааа. вот тыт понятно. Спасибо! а жаль между прочим! JVM все одно на всех платформах своя - могли-б и сопр. задействовать на прямую ... Добавлено @ 20:59
хотя я не прав опять - хочется выжать все из конкретной системы - пиши на компилирующихся в системный код языках. и все проблеммы будут разрешены -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
||||||||||||||
|
|||||||||||||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Ребята, зачем деление вычитанием? Причем просто вот так в цикле!
Вчера вечером вспомнил, что можно делить столбиком, и что битовые операции очень быстрые. В общем вот что получилось:
Кому не лень, сравните сскорости с делением методом вычитания в случаях, когда а) число делится на бОльшее (т.е. нуль в результате) б) очень большое число делится на единицу, например. в) что-нибудь на что-нибудь, когда ответ - первые единицы (1, 2, 3, ...) Вот случай (б) должен оказаться показательным Это сообщение отредактировал(а) Zandr - 17.3.2005, 08:37 |
|||
|
||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Ой, жалко - то как...... Тута ошибочка есть неразрешимая почти...
может вылазить при |a| > 0x40000000. Эх. Это сообщение отредактировал(а) Zandr - 18.3.2005, 07:52 |
|||
|
||||
| NotGonnaGetUs |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 25.2.2005 Где: Москва Репутация: 4 Всего: 12 |
прикольно, запустил тест "деление путём вычитания" c ключом -server (взят выше)
del by minus 31 milliseconds del by del 0 milliseconds без него, что-то порядка del by minus 47 milliseconds del by del 78 milliseconds %) Оптимизации это великолепно. Хотя вполне возможно, это следствие оптимизации цикла, в режиме -server. Так и есть. Если заменить 5000, на рандомный делитель int by = r.nextInt(4000)+1000; то обычное деление выигрывает в обычном и сервер моде. Короче говоря то, что делить вычитанием быстрее - тоже заблуждение. В случае -server / выигрывает в 2 раза, -client / выигрывает на 15-20% (1782 vs 1468 ms). Это сообщение отредактировал(а) NotGonnaGetUs - 17.3.2005, 18:29 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |