| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Стоит ли экономить память?))) |
| Автор: ДобренькийПапаша 11.7.2011, 15:18 |
| Стоит ли экономить память, используя, скажем, short вместо int в циклах там где это возможно и не происходит продвижения типов в выражениях в теле цикла (что, наверное нивелирует всю выгоду от использования short)? Я помню как в одном из своих первых проектов я для интереса прошёлся по достаточно большой программе и заменил все int где можно было на byte и short. В debug'е производительность сильно возросла (это было видно даже на глаз - студия даже работала быстрее |
| Автор: ДобренькийПапаша 11.7.2011, 19:39 | ||
Менял не только в циклах. На платформе x64, но таргетом была x86, да. |
| Автор: jonie 11.7.2011, 19:58 |
| ДобренькийПапаша, ну я все-равно не поверю. Потому как выравнивание один фиг наверняка по 4 байтной границе было (хотя насчет массивов не уверен)... |
| Автор: ДобренькийПапаша 11.7.2011, 20:16 | ||
Ну так в результате, каково ваше мнение-то? Я так понял, что ваше мнение заключается в том, что замена int на менее прожорливые примитивы не прибавит производительности. |
| Автор: jonie 11.7.2011, 21:19 |
| не прибавит. Пока есть память не прибавит вообще ничего, напротив, убавит. Возьмите IntelVTune да сами погоняйте... правда .net это проблемно, но на unmanaged типах можно посмотреть сколько будет промахиваться процессор |
| Автор: Fitc 12.7.2011, 08:25 | ||
Повышения производительности точно не будет потому что операции с числами размером 32, 64 байта обрабатываются процессором очень быстро. Так как на вход элементов ЦП типа АЛУ число записывается полностью, его не надо дробить и т.д. |
| Автор: ДобренькийПапаша 12.7.2011, 09:02 |
| То есть использовать short в обычных desktop-приложениях практически не имеет смысла (ну, с учётом того, что памяти у современных компьютеров хоть жопой жуй)? |
| Автор: klein 12.7.2011, 09:43 |
| На мой взгляд имеет смысл только тогда когда массив данных >= размеру L1, L2 кеша процессора, либо если размер переменной больше разрядности регистра (bigint, decimal на 32х-разрядниках). А так фифект мизерный. |
| Автор: Fitc 12.7.2011, 12:24 | ||
Мне кажется если итератор используется в for(int i=...), то сборщик мусора уничтожает его как только ты выходишь из цикла (т.к. эта переменная больше не используется), так что память не будет долго "заполнена" переменной типа int |
| Автор: jonie 12.7.2011, 15:49 | ||
а мне кажется что в некоторых случаях цикла вообще не будет, а в других будут использованы регистры процессора для счетчика и ничего в куче выделяться вообще не будет. |
| Автор: N1ko 14.7.2011, 17:03 | ||
Насколько я знаю CLR никогда с регистрами не общалась. В этом то его и фишка. И инты он все прописывает в стеке, не в куче(если конечно они не часть какого нибудь класса). Возможно будет происходить то, о чём вы писали, когда будет запускаться уже непосредственно преобразованый код из IL в Native например посредством NGen. ТО о чём вы сказали, скорее относится например к плюсам, которые не под дотнетом работают. Если я ошибаюсь, поправьте. |
| Автор: AlexNagits 14.7.2011, 21:06 | ||
Я бы на вашем месте доверял не глазам, а профилировщику |
| Автор: jonie 15.7.2011, 11:37 | ||
мне сложно комментировать какой-то эпический бред. Лучше прочитайте как работает IBM PC совместимые копьютеры, что такое ngen и как работает CLR. Можете еще исходники Mono поковырять.. |
| Автор: ДобренькийПапаша 12.8.2011, 08:12 | ||
jonie, меня очень заинтересовала эта тема и я решил почитать Рихтера. Прочитал пару глав и наткнулся на то, да, IL не имеет команд для работы с регистрами. (это совершенно точно). Но что это конкретно означает? Может ли CLR попросить ОС записать что-то в регистры? Или ей и просить ничего не надо (в том смысле, что при помещении команд в стек ОС сама решит какие ячейки памяти ей использовать)? Большое спасибо всем кто примет участие в теме))) |
| Автор: jonie 12.8.2011, 08:43 |
я вам даже больше скажу: IL вообще с CPU, памятью, диском и прочей истинно железной штукой не работает. IL компилируется в код под конкретный процессор. И, если например взять архитуетуру x64, то можно увидеть что там в основном используются регистры процессора, в то время как стек стараются не использовать. |
| Автор: ДобренькийПапаша 12.8.2011, 09:30 | ||
Спасибо. Стало яснее. Я тему отмечу как решённую. Если появятся вопросы тут ещё - я ещё спрошу))) |
| Автор: dj100500 21.8.2011, 20:30 |
| Может я и ошибаюсь, но если в IL нет команд для работы с регистрами то это еще ничего не значит т.к. всеравно в нэтив все в итоге по идее. ЗЫ ой блин вторую страницу не прочитал)) |
| Автор: Fitc 22.8.2011, 12:14 | ||
машинный код, который будет в итоге - зависит от конкретной машины, например, есть машины вообще без регистров |
| Автор: dj100500 22.8.2011, 21:31 | ||||
ды эт понятно все кста приведика мне "машины" без регистров вообще@_@ |
| Автор: Fitc 23.8.2011, 22:29 | ||||||
ну сам я реальные назвать не могу, но в теории такие бывают |