![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| nmn |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
что лучше
или
? |
||||
|
|||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
nmn,
посмотрите msil, который получился в результате мне кажется, что коды эквивалентны и компилятор сам всё оптимизирует -------------------- СУВ, Partizan. |
|||
|
||||
| QryStaL |
|
|||
![]() Intellectual feast ![]() ![]() Профиль Группа: Участник Сообщений: 914 Регистрация: 30.11.2005 Репутация: 10 Всего: 32 |
nmn, лучше использовать foreach.
А из перечисленных вами лучший 1-й, так как во втором случае в каждой итерации цикла будет проверка на выход за границы массива. Во первом случае она отсутствует. -------------------- I don't need a reason being who I am... |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
проверил, не поленился
но разница настолько минимальна (110мс на 100.000.000 итерациях), что всерьёз задаваться целью переписать все циклы, право, не стоит ну разве что весь остальной код оптимизирован настолько, что там возможные потери ещё меньше _______________ переписал тест, добавил foreach относительно первых двух результатов картина сильно изменилась теперь
Это сообщение отредактировал(а) mihryak - 21.12.2008, 12:42 |
|||
|
||||
| nmn |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
а можно код теста? Добавлено через 8 минут и 7 секунд
|
||||||||
|
|||||||||
| knox |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 1.12.2007 Репутация: нет Всего: нет |
цикл foreach работает в разы дольше for, там же как и если сравнивать as,is и typeof
|
|||
|
||||
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
foreach примерно в 1,5 раза медленнее но вот Array.Length оказался быстрее чем при использовании переменной mihryak все таки хотелось бы посмотреть на код вашего теста Это сообщение отредактировал(а) nmn - 21.12.2008, 20:09 |
|||
|
||||
| mihryak |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
вот первый тест, в котором foreach выигрывал у Length
обратите внимание, что в первом прогоне Length показывает результат почти в 3(!) раза лучше, чем в последующих 9. почему, интересно? сейчас переписал тест - результаты расположились более ожидаемо
вот код:
и там, и там в циклах произвожу нагрузочные действия, чтобы не дать оптимизатору выкинуть бесполезный код |
||||||
|
|||||||
| PashaPash |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
На самом деле результат зависит от конфигурации - debug/release, от конкретного процесора, от размера кэша, от ОС, от фаз луны...
Например, вот release/a.Length на моей машине:
Вот release с константой. Кстати, массив не используется в цикле, можно сразу выбросить.
А вот foreach, видны проверки range. Но иногда работает все равно быстрее - луна помогает.
На самом деле после IL еще столько уровней, что мерять миллисекунды на конкретной машине - бессмысленно. Скорость будет зависеть, скажем, от количества конвейеров, или от температуры в комнате. |
||||||
|
|||||||
| nmn |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
значит можно использовать foreach не боясь много(несколько порядков) потерять в производительности?
Это сообщение отредактировал(а) nmn - 22.12.2008, 04:12 |
||||
|
|||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
имхо foreach не так показателен для массивов, как for.
PashaPash че эт у тя за IL такой ? смахивает больше на x86 assembler (intel). вы под чистым .net -ом поглядите IL код.... там, глядишь, и до yeild дойдете мб (хз как там реализован foreach для массивов).... nmn надо сравнивать скорости для разных массивов) а-то оно уже в кеше и всякая фигня другая... foreach медленее, остальное всё фигня 8) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
А это и есть чистый x86 assembler, тот самый, в который IL скомпилировался. Странно сравнивать промежуточные результаты, если можно сравнить код, тем более что его умеет показывать сама студия. foreach для массивов все равно организован внутренними хаками, которые компилируются вот в такой забавный код. Никаких yield там нет, тупо цикл с проверкой границ. Это сообщение отредактировал(а) PashaPash - 22.12.2008, 13:48 |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 3 Всего: 56 |
Вот и не лень вам писать эту чушь из раза в раз?
Причём опираясь чисто на синтетический тест, на практике всё зависит от конкретной ситуации, а написать синтетический тест, который покажет, что цикл с for работает медленнее цикла с foreach не составит труда хоть сколько-нибудь опытному .NET-программисту! P.S. Особенно смешно смотрятся подобные метания с учётом того простого факта из практики, что пустых итераций не бывает, а в 90% случаев затраты на одну итерацию оказываются в разы больше, чем на внутренние механизмы foreach. В итоге вы в лучшем практическом(а не синтетическом) случае при 1000 итерациях выиграете от замены foreach на for приблизительно 0.1% от общего времени выполнения цикла. Безусловно это очень мощный стимул вовсе отказаться от foreach. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
source777, если не ошибаюсь, в одном из подобных топиков от Вас (тебя?) было сообщение, с упоминанием возможности объяснить, почему foreach действительно хорош, но из-за общего нервного тона дискуссии, ей (возможностью) воспользоваться было неуместно
можно ли это сделать здесь? безо всякой иронии спрашиваю |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |