Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Стоит ли экономить память?)))


Автор: ДобренькийПапаша 11.7.2011, 15:18
Стоит ли экономить память, используя, скажем, short вместо int в циклах там где это возможно и не происходит продвижения типов в выражениях в теле цикла (что, наверное нивелирует всю выгоду от использования short)?

Я помню как в одном из своих первых проектов я для интереса прошёлся по достаточно большой программе и заменил все int где можно было на byte и short. В debug'е производительность сильно возросла (это было видно даже на глаз - студия даже работала быстрее smile ).

Автор: jonie 11.7.2011, 16:48
Цитата(ДобренькийПапаша @  11.7.2011,  16:18 Найти цитируемый пост)
Я помню как в одном из своих первых проектов я для интереса прошёлся по достаточно большой программе и заменил все int где можно было на byte и short. В debug'е производительность сильно возросла (это было видно даже на глаз - студия даже работала быстрее smile ).

неповерю что производительность выросла, если меняли в циклах. на x86 не ну могло быть такого.

Автор: ДобренькийПапаша 11.7.2011, 19:39
Цитата(jonie @  11.7.2011,  16:48 Найти цитируемый пост)
неповерю что производительность выросла, если меняли в циклах. на x86 не ну могло быть такого. 

Менял не только в циклах. На платформе x64, но таргетом была x86, да.

Автор: jonie 11.7.2011, 19:58
ДобренькийПапаша, ну я все-равно не поверю. Потому как выравнивание один фиг наверняка по 4 байтной границе было (хотя насчет массивов не уверен)...

Автор: ДобренькийПапаша 11.7.2011, 20:16
Цитата(jonie @  11.7.2011,  19:58 Найти цитируемый пост)
ДобренькийПапаша, ну я все-равно не поверю. Потому как выравнивание один фиг наверняка по 4 байтной границе было (хотя насчет массивов не уверен)... 

Ну так в результате, каково ваше мнение-то? Я так понял, что ваше мнение заключается в том, что замена int на менее прожорливые примитивы не прибавит производительности.

Автор: jonie 11.7.2011, 21:19
не прибавит. Пока есть память не прибавит вообще ничего, напротив, убавит.
Возьмите IntelVTune да сами погоняйте... правда .net это проблемно, но на unmanaged типах можно посмотреть сколько будет промахиваться процессор

Автор: Fitc 12.7.2011, 08:25
Цитата(ДобренькийПапаша @ 11.7.2011,  15:18)
Стоит ли экономить память, используя, скажем, short вместо int в циклах там где это возможно и не происходит продвижения типов в выражениях в теле цикла (что, наверное нивелирует всю выгоду от использования short)?

Я помню как в одном из своих первых проектов я для интереса прошёлся по достаточно большой программе и заменил все int где можно было на byte и short. В debug'е производительность сильно возросла (это было видно даже на глаз - студия даже работала быстрее smile ).

Повышения производительности точно не будет потому что операции с числами размером 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
Цитата(ДобренькийПапаша @ 12.7.2011,  09:02)
То есть использовать short в обычных desktop-приложениях практически не имеет смысла (ну, с учётом того, что памяти у современных компьютеров хоть жопой жуй)?

Мне кажется если итератор используется в for(int i=...), то сборщик мусора уничтожает его как только ты выходишь из цикла (т.к. эта переменная больше не используется), так что память не будет долго "заполнена" переменной типа int

Автор: jonie 12.7.2011, 15:49
Цитата(Fitc @  12.7.2011,  13:24 Найти цитируемый пост)

Мне кажется если итератор используется в for(int i=...), то сборщик мусора уничтожает его как только ты выходишь из цикла (т.к. эта переменная больше не используется), так что память не будет долго "заполнена" переменной типа int

а мне кажется что в некоторых случаях цикла вообще не будет, а в других будут использованы регистры процессора для счетчика и ничего в куче выделяться вообще не будет.

Автор: N1ko 14.7.2011, 17:03
Цитата(jonie @  12.7.2011,  15:49 Найти цитируемый пост)
а мне кажется что в некоторых случаях цикла вообще не будет, а в других будут использованы регистры процессора для счетчика и ничего в куче выделяться вообще не будет.

Насколько я знаю CLR никогда с регистрами не общалась. В этом то его и фишка. И инты он все прописывает в стеке, не в куче(если конечно они не часть какого нибудь класса). Возможно будет происходить то, о чём вы писали, когда будет запускаться уже непосредственно преобразованый код из IL в Native например посредством NGen. ТО о чём вы сказали, скорее относится например к плюсам, которые не под дотнетом работают.  Если я ошибаюсь, поправьте.

Автор: AlexNagits 14.7.2011, 21:06
Цитата

это было видно даже на глаз - студия даже работала быстрее smile ). 

Я бы на вашем месте доверял не глазам, а профилировщику

Автор: jonie 15.7.2011, 11:37
Цитата(N1ko @  14.7.2011,  18:03 Найти цитируемый пост)
асколько я знаю CLR никогда с регистрами не общалась. В этом то его и фишка. И инты он все прописывает в стеке, не в куче(если конечно они не часть какого нибудь класса). Возможно будет происходить то, о чём вы писали, когда будет запускаться уже непосредственно преобразованый код из IL в Native например посредством NGen. ТО о чём вы сказали, скорее относится например к плюсам, которые не под дотнетом работают.  Если я ошибаюсь, поправьте.

мне сложно комментировать какой-то эпический бред. Лучше прочитайте как работает IBM PC совместимые копьютеры, что такое ngen  и как работает CLR. Можете еще исходники Mono поковырять..

Автор: ДобренькийПапаша 12.8.2011, 08:12
Цитата(jonie @  15.7.2011,  11:37 Найти цитируемый пост)
мне сложно комментировать какой-то эпический бред. Лучше прочитайте как работает IBM PC совместимые копьютеры, что такое ngen  и как работает CLR. Можете еще исходники Mono поковырять.. 


jonie, меня очень заинтересовала эта тема и я решил почитать Рихтера. Прочитал пару глав и наткнулся на то, да, IL не имеет команд для работы с регистрами. (это совершенно точно). Но что это конкретно означает? Может ли CLR попросить ОС записать что-то в регистры? Или ей и просить ничего не надо (в том смысле, что при помещении команд в стек ОС сама решит какие ячейки памяти ей использовать)?

Большое спасибо всем кто примет участие в теме)))

Автор: jonie 12.8.2011, 08:43
Цитата(ДобренькийПапаша @  12.8.2011,  09:12 Найти цитируемый пост)
IL не имеет команд для работы с регистрами.

я вам даже больше скажу: IL вообще с CPU, памятью, диском и прочей истинно железной штукой не работает. IL компилируется в код под конкретный процессор. И, если например взять архитуетуру x64, то можно увидеть что там в основном используются регистры процессора, в то время как стек стараются не использовать.

Автор: ДобренькийПапаша 12.8.2011, 09:30
Цитата(jonie @  12.8.2011,  08:43 Найти цитируемый пост)
я вам даже больше скажу: IL вообще с CPU, памятью, диском и прочей истинно железной штукой не работает. IL компилируется в код под конкретный процессор. И, если например взять архитуетуру x64, то можно увидеть что там в основном используются регистры процессора, в то время как стек стараются не использовать. 

Спасибо. Стало яснее. Я тему отмечу как решённую. Если появятся вопросы тут ещё - я ещё спрошу)))

Автор: dj100500 21.8.2011, 20:30
Может я и ошибаюсь, но если в IL нет команд для работы с регистрами то это еще ничего не значит т.к. всеравно в нэтив все в итоге по идее.

ЗЫ ой блин вторую страницу не прочитал))

Автор: Fitc 22.8.2011, 12:14
Цитата(dj100500 @ 21.8.2011,  20:30)
Может я и ошибаюсь, но если в IL нет команд для работы с регистрами то это еще ничего не значит т.к. всеравно в нэтив все в итоге по идее.

ЗЫ ой блин вторую страницу не прочитал))

машинный код, который будет в итоге - зависит от конкретной машины, например, есть машины вообще без регистров

Автор: dj100500 22.8.2011, 21:31
Цитата(Fitc @ 22.8.2011,  12:14)
Цитата(dj100500 @ 21.8.2011,  20:30)
Может я и ошибаюсь, но если в IL нет команд для работы с регистрами то это еще ничего не значит т.к. всеравно в нэтив все в итоге по идее.

ЗЫ ой блин вторую страницу не прочитал))

машинный код, который будет в итоге - зависит от конкретной машины, например, есть машины вообще без регистров

ды эт понятно все
кста приведика мне "машины" без регистров вообще@_@

Автор: Fitc 23.8.2011, 22:29
Цитата(dj100500 @ 22.8.2011,  21:31)
Цитата(Fitc @ 22.8.2011,  12:14)
Цитата(dj100500 @ 21.8.2011,  20:30)
Может я и ошибаюсь, но если в IL нет команд для работы с регистрами то это еще ничего не значит т.к. всеравно в нэтив все в итоге по идее.

ЗЫ ой блин вторую страницу не прочитал))

машинный код, который будет в итоге - зависит от конкретной машины, например, есть машины вообще без регистров

ды эт понятно все
кста приведика мне "машины" без регистров вообще@_@

ну сам я реальные назвать не могу, но в теории такие бывают  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)