| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Алгоритм]сравнивать на равенство или на больше |
| Автор: babe 6.3.2009, 12:05 |
| Добрый день, При поиске в некотором массиве сравнение индекса для некоторой задачи можно записать: если(индекс > 0) либо если(индекс <> 0). Результат будет правильным и в том и в другом случае. Вопрос в том- в каком случае сравнение произойдет быстрее и будет ли это быстрее, то есть есть ли принципиальная разница что лучше использовать- видимо обоснованием будет каким образом происходит сравнение на больше? Можно ли где-нибудь прочитать каким образом сравниваются больше и меньше? как это происходит внутри языков? Заранее большое спасибо! |
| Автор: Gaudi 6.3.2009, 12:56 | ||||||||
asm код, полученной в IDA 5.2
если
то
jle(of 8e) и jz(of 84) выполнятся одинаково ?_быстро_? ps: компилировал в vc2008 express с опциями по-умолчанию |
| Автор: GoldFinch 6.3.2009, 13:03 | ||
конпелятор msvc не перестаем меня радовать обычно для проверки на равенство нулю юзают test eax,eax\jz xxx а для сравнения с нулем cmp xxx,0\jxx zzz test eax,eax короче и может гдето быстрее впрочем с таким компилятором об оптимизации такого рода можно не думать, и так и так *плохо* компилит |
| Автор: MaXL 6.3.2009, 14:58 |
| GoldFinch, а разве MSVC++ не лучший в мире компилер по оптимизации ? чот я слышал такой расклад: 1) MSVC++. 2) Intel. 3) g++ Gaudi, попробуйти ещё интеловским скомпилить. И вообще вы в каком режиме компилили, с оптимизацией ? |
| Автор: alexanderwdark 6.3.2009, 15:14 | ||||
ICC 11, конечно, гораздо разумнее компилирует, чем MSVC.
|
| Автор: Coder 6.3.2009, 15:19 |
| Кстати, Delphi 7 использует инструкцию test. |
| Автор: alexanderwdark 6.3.2009, 15:30 | ||
В последних версиях компилятор в делфи очень даже разумный. Не раз видел отличный высокоуровневый код, например компрессоров на чистом делфи, дающий более высокую производительность, чем оптимизированный сишный. |
| Автор: Gaudi 6.3.2009, 15:33 | ||||||
Тот же Си код, но с оптимизацией по скорости (/O2)
Ни байта лишнего кода! Тогда вот для этого
msvc с теми же опциями дает
Intell c++ compiler'a под рукой нету |
| Автор: alexanderwdark 6.3.2009, 15:34 | ||||||||||||
Немного измел код для того, чтобы оптимизатор не ингорировал код, не имеющий эффекта (поскольку в исходном результат переменной b не используется нигде после присванивания)
MSVC 9 (maximize speed mode)
Intel CPP11 Maximize Speed + Hi-level
C Builder 2007:
FreePascal 2.2.2 с оптимизацией
и без
|
| Автор: Sefko 6.3.2009, 17:05 |
| Забавно все это читать новичку. Интересно не столько то, что такой вопрос появился а разделе "Алгоритмы", сколько стиль ответов, по всему видно, знающих людей. Смотрим профиль вопрошающей, на предмет выяснения языка программирования, который интересен ей. Что видим? Четыре предыдущих сообщения babe относились к JavaScript. . |
| Автор: babe 6.3.2009, 17:36 |
| Четыре предыдущих сообщения( смотри дату) не дают возможности сделать вывод о том, что меня интересует меня интересует КАК обрабатывается сравнение на больше - то есть можно ли где то почитать вразумительно реализацию этого внутри компилятора- любого. Кажется в разделе оговаривается не привязываться к конкретному языку, но если уж так это принципиально- решение задачи видится на php. Но конечно количество ответов и их содержимое меня впечатлило!))) Идея практическая понятна- большое спасибо- но хотелось бы слегка теории- так сказать изнутри. Если не затруднит. Большое спасибо всем, кто откликнулся и потратил свое время!!! |
| Автор: zim22 6.3.2009, 18:31 |
напишите два варианта кода. один с <, второй с <>. замерьте время выполнения. что выполняется быстрее - то и происходит быстрее. |
| Автор: Sefko 6.3.2009, 19:35 | ||
Тут вот какое дело. 1. Вообще-то именно в такой постановке (реализация внутри любого компилятора) вопрос не имеет смысла. 2. Для большинства компиляторов - во всяком случае, для компиляторов с языка C++ - вопрос вряд ли актуален с практической точки зрения. Не удастся как-то ускорить выполнение на таких мелочах. Так что тут имеет смысл разве что теоретический интерес к качеству транслятора. 3. Кроме компиляторов бывают еще интерпретаторы. Вот для них этот вопрос, пожалуй, более актуальный. Тут бывают всякие чудеса. 4. Реализация исполнения скриптов осуществляется таки интерпретаторами. Например, http://ru.wikipedia.org/wiki/JavaScript 5. Написать скрипт, который будет достаточно бодро исполняться на НЕИЗВЕСТНО каком компьютере НЕИЗВЕСТНО каким интерпретатором - задача не очень простая. А именно такая задача и стоит, если делается какое-то сетевое приложение. И вряд ли (ну, мне так кажется) решению этой задачи могут помочь ассемблерные коды, изготовленные разными трансляторами с языка C++. Подлянка состоит в том, что даже такие разумные советы, как данный здесь на ветке - измерить физическое время, - как-то трудно осуществимы. Не из-за этих ли обстоятельств и появилась "теоретическая" постановка вопроса? 6. И, тем не менее, все обсуждение сконцентрировалось вокруг анализа ассемблерных кодов. Ну, вот сочетание всего этого мне и показалось забавным. Не обессудьте - не смог удержаться от эмоциональной реплики по такому случаю. |
| Автор: Rififi 7.3.2009, 10:07 |
| GoldFinch, конпелятор msvc не перестаем меня радовать Возрадуйся ещё больше, когда откроется тебе Знамение, что такое конструкции mov [ebp+var_8], eax cmp [ebp+var_8], 0 конпелятор использует только в дебаге. |
| Автор: GoldFinch 7.3.2009, 10:24 |
| Rififi, в релизе при работе с вещественными числами он и не такое использует |
| Автор: babe 7.3.2009, 10:39 | ||||
Вот и ответ!
GoldFinch, спасибо
|
| Автор: zim22 7.3.2009, 11:30 | ||
babe, GoldFinch уже ответил каким образом:
|
| Автор: GoldFinch 7.3.2009, 11:36 |
| babe, все зависит от платформы Если платформа аппаратная - конкретное семейство процессоров (например х86) то инструкции аппаратные и проверка на 0 выполняется аппаратно, например операцией ИЛИ для всех разрядов числа. Если платформа программная - виртуальная машина которая обрабатывает байт-код (java, .NET) то ее инструкции выполняются виртуальной машиной, путем выполнения кода на конкретной аппаратной платформе. Вобщем если платформа поддерживает отдельную инструкцию проверки на 0, то она какнибудь ее реализует |
| Автор: babe 7.3.2009, 12:01 |
| угу, все понятно- что ж тут непонятного. Спасибо! Конечно инструкция с одним операндом выполнится быстрее, чем с двумя. Меня просто смутило "не выполняет никаких логических действий". |
| Автор: alexanderwdark 10.3.2009, 15:35 |
| Говоря о оптимизации, сложно вести речь о интерпретаторах и о компиляторах, не генерирующих машинный код. Быстродействующие решения принципиально не разрабатываются для виртуальных машин, реалтайм интерпретаторов да и dotnet. Что касается последней - по причине значительной общипанности последней и переходу к ограниченному безопасному программированию. Область оптимизаци - ASM, C/C++ без классов, Delphi/FPC/GPC без классов. Здесь возможен наиболее оптимальный код, в частности, наиболее эффективная реализация компрессоров, криптосистем и прочих критичных по времени алгоритмов. Если речь идет о JavaScipt - тут говорить нечего. Все зависит от конретной реализации машины браузером, подобная оптимизация здесь особенно ничего не решит. Подумайте лучше о алгоритмической оптимизации. Чаще всего в подобных случаях помогает выбор более разумного алгоритма. К примеру, замена алгоритмов сортировки, простейшее хэширование при поиске и прочее.. |