|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Вот есть у меня сборная солянка настроек и входных данных, организованных под одним большим объектом (типа Settings). Настройки - много маленьких переменных, организованных в разных классах и подклассах, входные данные - несколько больших коллекций (до сотен тысяч даблов). Мне удобно всё хранить в одном объекте, т. к. есть сценарии, где это всё передаётся куда-нибудь далеко через сеть. Надо передать мне этот объект в функцию на расчёт. Как это происходит и какие затраты при этом будут? Вот хранится объект этот в ОЗУ. Вот я вызываю функцию, в которую передаю этот объект по ссылке. В этой функции из объекта используются не все данные, а входные в указанных пределах (т. е. циклом for, например, прохожусь где-нибудь по двум тысячам элементов из исходных ста тысяч, причём берутся эти две тысячи где-нибудь из середины) и настройки из полей разной вложенности. Вопросы, что при этом происходит: 1) при этом в кеш процессора грузится весь объект? 2) если не весь, то коллеция, из которой я прохожусь только по части, грузится в кеш вся или только в указанных пределах? А то я тут прочитал, что надо все расчёты укладывать в кеш, тогда разницы между что вашим ассемблером, что СиШарпом почти не будет. А если в кеш не укладываешься, то простое обращение к ОЗУ снижает производительность уже на порядок из-за задержек и простоев ЦПУ. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 11:18 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320А то я тут прочитал, что надо все расчёты укладывать в кеш, тогда разницы между что вашим ассемблером, что СиШарпом почти не будет. А если в кеш не укладываешься, то простое обращение к ОЗУ снижает производительность уже на порядок из-за задержек и простоев ЦПУ. где прочитал? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 11:21 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
pation, в любом языке программирования при передачи объекта по ссылке передается не сам объект, а адрес в памяти этого объекта. То есть затрат при передачи "практически" и не будет. Если передаешь объект по значению, то объект полностью копируется. Операции в памяти, особенно копирование в современное время очень быстрые. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 11:31 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320циклом for, например, прохожусь где-нибудь по двум тысячам элементов из исходных ста тысяч, причём берутся эти две тысячи где-нибудь из середины) и настройки из полей разной вложенности Ты уверен, что нужно всё это скоупом инициализить? Посмотри на вариант получения параметра по требованию. Получил конкретное значение - положил в кеш (на определенное t). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 11:35 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320, авторвашим ассемблером, что СиШарпом почти не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 11:37 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
авторвашим ассемблером, что СиШарпом почти не будет да, да , не будет. особенно если асмом гвозди заколачивать, и не использовать расширенный набор команд. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 11:38 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Roman Mejtespation, в любом языке программирования при передачи объекта по ссылке передается не сам объект, а адрес в памяти этого объекта. То есть затрат при передачи "практически" и не будет. Если передаешь объект по значению, то объект полностью копируется. Операции в памяти, особенно копирование в современное время очень быстрые. спасибо, что просветил, кстати про любой языке программирования это ты загнул ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 12:12 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУПолучил конкретное значение - положил в кеш (на определенное t). ТС имеет ввиду процесорный кэш ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 12:14 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
pationМСУПолучил конкретное значение - положил в кеш (на определенное t). ТС имеет ввиду процесорный кэш Я понял, что речь идет о TLB и иже с ним, я имею ввиду, что задумываться об этом вообще не надо, да и вредно. За всякие грабли типа этого нужно расстреливать на месте, не говоря о том, что еще под вопросом, как он будет считывать и записывать объект в процессорный кеш. Короче, идиотизм это. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 12:22 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
pation, и каким образом можно сказать "положите это в кеш"? этим разве не сам процессор занимается? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 12:51 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
pationuser7320А то я тут прочитал, что надо все расчёты укладывать в кеш, тогда разницы между что вашим ассемблером, что СиШарпом почти не будет. А если в кеш не укладываешься, то простое обращение к ОЗУ снижает производительность уже на порядок из-за задержек и простоев ЦПУ. где прочитал? Сейчас ссылку не приведу, но это была одна из статей на МСДН от создателя Дотнета, за 2003 год. Название, как-то связанное с производительностью. МСУuser7320циклом for, например, прохожусь где-нибудь по двум тысячам элементов из исходных ста тысяч, причём берутся эти две тысячи где-нибудь из середины) и настройки из полей разной вложенности Ты уверен, что нужно всё это скоупом инициализить? Посмотри на вариант получения параметра по требованию. Получил конкретное значение - положил в кеш (на определенное t). Дело в том, что я не знаю, когда данные переносятся в кеш, а когда остаются в ОЗУ. Вот, скажем, расчёт в теле текущей функции идёт в кеше, а параметры, переданные в эту функцию, тоже в кеше, или всё еще в ОЗУ и в кеш отправятся, когда к ним непосредственно обратятся? Насчёт "скопом инициализировать" - да прсто это исходные данные такие. Я получаю настройки и массивы чисел в виде исходных данных. Обрабатываю числа, используя настройки. Поскольку на каждом этапе расчёте используется свой набор настроек и свой массив чисел, то думаю, не проще ли в каждую функцию расчёта передавать сразу весь объект настроек, чем выделять из него кучку перепенных и массивы? Я так понимаю, что если я передам в функцию весь объект по ссылке, но буду использовать не все его части, то в кеш пойдут только те его части, которые я буду использовать, а не весь объект целиком. Правильно? beg-in-erавторвашим ассемблером, что СиШарпом почти не будет да, да , не будет. особенно если асмом гвозди заколачивать, и не использовать расширенный набор команд. Насколько я знаю, это уже отсекает старые процессоры от вашей программы, а компиляторы заточены по умолчанию на максимальнуюж совместимость. Т. е. если настроить на последние модели процев с их SSE4,5,...25, то разница будет буквально минимальной в большинстве случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:09 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
pationuser7320А то я тут прочитал, что надо все расчёты укладывать в кеш, тогда разницы между что вашим ассемблером, что СиШарпом почти не будет. А если в кеш не укладываешься, то простое обращение к ОЗУ снижает производительность уже на порядок из-за задержек и простоев ЦПУ. где прочитал? http://msdn.microsoft.com/en-us/library/ms973852.aspx Глава "Of Cache Misses, Page Faults, and Computer Architecture". авторNow our fastest PCs can issue up to ~9000 operations per microsecond, but in that same microsecond, only load or store to DRAM ~10 cache lines. In computer architecture circles this is known as hitting the memory wall. Caches hide the memory latency, but only to a point. If code or data does not fit in cache, and/or exhibits poor locality of reference, our 9000 operation-per-microsecond supersonic jet degenerates to a 10 load-per-microsecond tricycle. Думаю, что ситуация в принципе не изменилась и в наше время. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:14 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Согласен, что про ассемблер вроде там ничего не говорится. Значит, запамятовал и свои мысли выдал за то, что якобы в статье написали. Но вроде это и логически вытекает - на ассемблере ты сам памятью управляешь и знаешь, чего куда сколько загрузил. А на C# ты только примерно знаешь, где чего и сколько, ибо выяснить, что за собой потянет тот или иной объект, особенно если он из сторонней библиотеки, можно только тестируя каждый такой объект и выясняя его размер. Согласитесь, это не то, что мы хотели получить, переходя на высокоуровневое программирование. А кстати, когда на ассемблере пишешь, там есть разные адресные пространства для каждого уровня кеша и для ОЗУ? Вот на C# или С++ попробуйте обратиться к адресу переменной на каком-нибудь уровне кеша. По-моему, это вообще не контролируется из языка такого уровня - максимум доступ к ОЗУ есть. Разве нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:24 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Разве нет? неа, просто думать нужно что происходит с кэшом данных при обработке больших массивов ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:35 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Изопропилuser7320Разве нет? неа, просто думать нужно что происходит с кэшом данных при обработке больших массивов А чего тут думать? - Знать надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:36 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320, 0. Странно, что ты сам не догадался. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:38 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Вот в ОЗУ есть большой массив, который явно целиком не укладывается в кеш. Передаю я его по ссылке в функцию. В кеше на данный момент чего? Адрес первого элемента массива в ОЗУ? ОК. Дальше работаю не со всем массивом, а только в каком-то диапазоне, начальный и конечный индексы которого тоже в функцию передаю. Теперь в кеше уже адрес первого элемента массива и два индекса. Так? Дальше иду for'ом по массиву, где, скажем, складываю по десять соседних элементов массива, делю результат на десять (интерполяция) и записываю результат в другой массив. Теперь уже на каждой итерации цикла for в кеше адрес первого массива, два индекса, значения десяти элементов первого массива, адрес второго массива и адрес ячейки второго массива, в которую я записываю результат интерполяции. Примерно так? Есил так, то я не выхожу за пределы кеша, т. к. не гружу все массивы в него. Я крут? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:42 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Дело в том, что я не знаю, когда данные переносятся в кеш, а когда остаются в ОЗУ. Стоп, давай определимся с терминами. Что ты имеешь ввиду по словом "кеш"? Покажи пример кода, как ты кешируешь данные. user7320Вот, скажем, расчёт в теле текущей функции идёт в кеше, а параметры, переданные в эту функцию, тоже в кеше, или всё еще в ОЗУ и в кеш отправятся, когда к ним непосредственно обратятся? Я не понимаю на языке инопланетян - объясни, что такое "расчёт в теле текущей функции идёт в кеше". Это что-то из области фантастического воспалённого воображения... user7320Насчёт "скопом инициализировать" - да прсто это исходные данные такие. Я получаю настройки и массивы чисел в виде исходных данных. Еще раз - давай на пальцах (с примерами кода), откуда, что и как ты получаешь в виде исходных данных. Я не люблю общаться на "инопланетном сленге" оперируя сферическими конями в вакууме, давай более предметно. user7320не проще ли в каждую функцию расчёта передавать сразу весь объект настроек, чем выделять из него кучку перепенных и массивы? Передавай, конечно. В чем проблема-то? user7320Я так понимаю, что если я передам в функцию весь объект по ссылке, но буду использовать не все его части, то в кеш пойдут только те его части, которые я буду использовать, а не весь объект целиком. Правильно? Мля, какой такой "кеш", ты о чем? Я тут погадал на кофе и мне подсказала интуиция, что у тебя с основами .NET проблема. Срочно читать про стек, кучу, GC, управление памятью, и т.д. Гугли буквари типа Рихтера. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 22:43 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУuser7320Дело в том, что я не знаю, когда данные переносятся в кеш, а когда остаются в ОЗУ. Стоп, давай определимся с терминами. Что ты имеешь ввиду по словом "кеш"? Покажи пример кода, как ты кешируешь данные. Кеш - это кеш процессора. Я не знаю, когда я кеширую данные. В том-то и штука. Как я из СиШарпа узнаю, что я данные в данный момент кеширую? Я могу только сказать, что если я в данные момент работаю с какой-то переменной, то её значение и её адрес прошли через кеш. авторЕще раз - давай на пальцах (с примерами кода), откуда, что и как ты получаешь в виде исходных данных. У меня есть класс в отдельной сборке, в котором есть основная функция расчёта. Программа загружает мою сборку и передаёт моей функции один объект, который содержит в своих полях и настройки, и массивы данных. Моя функция расчёта по мере продвижения этого расчёта берёт разные части входящего объекта. Ну вот, например, не придираясь к правильности кода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Буквари я погуглю про кучи и управление памятью, но попозже. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:03 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Кеш - это кеш процессора. Забудь о нём при работе с .NET. Договорились? user7320Я не знаю, когда я кеширую данные. В том-то и штука. Как я из СиШарпа узнаю, что я данные в данный момент кеширую? Я могу только сказать, что если я в данные момент работаю с какой-то переменной, то её значение и её адрес прошли через кеш. 1. То есть ты не знаешь, когда кешируешь данные, но при этом ты точно уверен, что их кешируешь? 2. Бред сивой кобылы. Срочно читай основы .NET и перестань молоть языком про "кеш процессора". user7320Ну вот, например, не придираясь к правильности кода Причем тут кеш, тем более - процессора? user7320Буквари я погуглю про кучи и управление памятью, но попозже. Давай наоборот, друх? Сначала покури буквари, а потом мы вместе посмеемся над тем, какие глупости ты тут постил. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:12 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Я не знаю, когда я кеширую данные. Объясни цель этого знания. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:13 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320, к внимательному прочтению и освоению: Автоматическое управление памятью Автоматическое управление памятью в .NET Сборка мусора Сборка мусора Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework Garbage Collector Basics and Performance Hints ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:19 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
авторЗабудь о нём при работе с .NET. Договорились? А чего тогда Jan Gray о нём говорит? http://msdn.microsoft.com/en-us/library/ms973852.aspx Пишет о Дотнете, а говорит а кеше процессора. автор1. То есть ты не знаешь, когда кешируешь данные, но при этом ты точно уверен, что их кешируешь? 2. Бред сивой кобылы. Срочно читай основы .NET и перестань молоть языком про "кеш процессора". Да хоть куча, хоть стек - если я работаю СЕЙЧАС с этой переменной, то она в кеше БЫЛА ИЛИ ЕСТЬ, и вообще СЕЙЧАС она в конвейере процессора, в регистрах данных. Но мне туда доступа нет. Жан Грей заикнулся про кеш и сказал, что негоже, мол, выходить за рамки кеша при вычислениях. Я так понимаю, что я могу это ПРИБЛИЗИТЕЛЬНО контролировать, не запрашивая огромные массивы данных без надобности. Т. е. это доступно даже для дотнетчиков с их управляемой памятью. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:23 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУuser7320, к внимательному прочтению и освоению: Автоматическое управление памятью Автоматическое управление памятью в .NET Сборка мусора Сборка мусора Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework Garbage Collector Basics and Performance Hints Я там слов "кеш" и "кэш" в смысле кеш процессора не встречал. Да и понятно, что эти кучи и стеки все в ОЗУ организуются. Я же про кеш процессора говорил. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:27 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Т. е. это доступно даже для дотнетчиков с их управляемой памятью Не для всех. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:28 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320А чего тогда Jan Gray о нём говорит? http://msdn.microsoft.com/en-us/library/ms973852.aspx Пишет о Дотнете, а говорит а кеше процессора. Он там и про машинные коды много чего рассказывает:регистры, call, xor, cmp и т.д. Почему ты не спрашиваешь нас, как юзать ассемблерные вставки в дотнете? Готов тебя разочаровать - их нет в .NET. user7320Да хоть куча, хоть стек - если я работаю СЕЙЧАС с этой переменной, то она в кеше БЫЛА ИЛИ ЕСТЬ Забудь слово кеш, десятый раз повторяю. Переменная может сидеть в стеке, а может в куче (адрес). Читай буквари, человек - тема сто раз пережевана на форуме. user7320и вообще СЕЙЧАС она в конвейере процессора, в регистрах данных. Но мне туда доступа нет. Ты с какой планеты, студент? :) user7320Жан Грей заикнулся про кеш и сказал, что негоже, мол, выходить за рамки кеша при вычислениях. Убей Жан Грея. И займись делом. user7320Я так понимаю, что я могу это ПРИБЛИЗИТЕЛЬНО контролировать, не запрашивая огромные массивы данных без надобности. Т. е. это доступно даже для дотнетчиков с их управляемой памятью. Так? Это недоступно. Забудь об этом (с) Донни Браско ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:30 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Я там слов "кеш" и "кэш" в смысле кеш процессора не встречал. Да и понятно, что эти кучи и стеки все в ОЗУ организуются. Я же про кеш процессора говорил. И не встретишь, а тем более про управление. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:31 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Изопропилuser7320Т. е. это доступно даже для дотнетчиков с их управляемой памятью Не для всех. Чего трудного понять, что кеш процессора маленький и лучше брать АМД, чем Интел и вообще АМД лучше не стоит в расчётах использовать слишком много данных сразу - стоит разделять расчёты на более мелкие задачи, тогда их можно будет проворачивать в кеше, не обращаясь на середине операции в ОЗУ за новой порицей. Обращаться стоит только переходя к новой подзадаче. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:31 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Изопропилпропущено... Не для всех. Чего трудного понять, что кеш процессора маленький и лучше брать АМД, чем Интел и вообще АМД лучше не стоит в расчётах использовать слишком много данных сразу - стоит разделять расчёты на более мелкие задачи, тогда их можно будет проворачивать в кеше, не обращаясь на середине операции в ОЗУ за новой порицей. Обращаться стоит только переходя к новой подзадаче. Как-то так. Ну вот, скажем, я могу весь расчёт запихать в одну функцию. А могу разбить на подзадачи, потом ещё на подзадачи, где в каждый момент будет обрабатываться только небольшой объём данных. Тогда в первом случае у меня будет огромное число локальных переменных, включая тяжёлые массивы, и всё это с болшой вероятностью захочет попасть в кеш, вытесняя друг друга оттуда, а во-втором случае локальных переменных будет немного и в кеше им найдётся место всем. Такой уровень понимания доступен же дотнетчикам? Это вообще элементарная логика, по-моему. Я понимаю, что реальная картина будет несколько другой и точно контролировать размер данных в кеше я не смогу. Но приблизительно же могу? Могу наделать миллиард локальных даблов и кеш будет постоянно обращаться к ОЗУ. А могу всего тысячу и все операции с ними не выйдут за рамки кеша, пока я не закончу текущую подзадачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:37 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Ну и, возвращаясь к началу, поэтому я и спросил, что когда я по ссылке передаю большой массив, и в цикле обращаюсь к этому массиву, но не ко всему, а только к небольшому объёму его данных (их сумма заведомо укладывается даже в десятую часть кеша), то я крут и пишу быстрый код, или это всё бесполезно и компилятор может такое накомпилить, что даже всего тысяча даблов не опместится в десятимегабайтный кеш? Ну хотя бы потому, что в этот же кеш потянутся всякие другие объекты. Например, я вызываю функции из фреймворка, которые чего-то там вычисляют - а кто его знает, сколько они при этом дополнительных объектов создают. М? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:42 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320, мне кажется, что это вы не понимаете ответов, которые вам озвучивают. На .Net нет языков, позволяющих управлять железом на уровне ассемблера. Компилятор сам выбирает нужное множество команд процессора. И сам рулит размещением данных в регистрах. А "конвейер команд" в применении к .Net вообще выглядит смешно. Код в любом языке будет исполняться быстрее, если там мало ветвлений. Тогда больше шансов на то, что процессор сможет предугадать следующие команды. Что касается скорости, то один громоздкий метод будет работать быстрее, чем он же, декомпозированный на тысячу методов. Переход из метода в метод - не самая быстрая операция в .Net Если у вас какая то мания насчет сверхскорости исполнения задач, переходите на чистый C/С++. Преимущество dotNet не в сверхскорости работы программ, а в сверхскорости разработки этих программ. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:48 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
И да, сейчас я вспомнил, что всё это - про кучи всякие и стеки - я уже давно читал, и даже несколько раз. И забыть успел несколько раз также. Потому что я запомнил главное - к кешу процессора эти сборщики мусора отношения никакого не имеют, также, как к реальной производительности. Простой при сборке мусора ничто по сравнению с простоем при постоянном обращении к ОЗУ вместо кеша, при промахах кеша и т. п.. Потому что сборщик работает (пытается работать) тогда и так, чтобы юзер не замечал падения производительности, а выход за пределы кеша о юзере не заботится и происходит в произвольный момент времени, если вы не позаботились об этом в своём коде. И в данный момент эти сборщики вылетели у меня из головы. Потому что я сейчас про кеш спрашиваю. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:48 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320то я крут и пишу быстрый код.... с такой постановкой вопросов до крутизны ещё очччччччччччень далеко. так , на будущее, если нужны вычисления , то нюхать в этом направлении в этом направлении и забыть про CPU. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:51 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320И да, сейчас я вспомнил, что всё это - про кучи всякие и стеки - я уже давно читал, и даже несколько раз. И забыть успел несколько раз также не забивайте себе голову процессорным кэшом. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:52 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-erто нюхать в этом направлении в этом направлении и забыть про CPU. от задачи зависит - на передачу данных в память GPU и обратно тоже нужно время. в некоторых случаях AVX может дать лучший результат ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:55 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Arm79user7320, мне кажется, что это вы не понимаете ответов, которые вам озвучивают. На .Net нет языков, позволяющих управлять железом на уровне ассемблера. Компилятор сам выбирает нужное множество команд процессора. И сам рулит размещением данных в регистрах. А "конвейер команд" в применении к .Net вообще выглядит смешно. Код в любом языке будет исполняться быстрее, если там мало ветвлений. Тогда больше шансов на то, что процессор сможет предугадать следующие команды. Что касается скорости, то один громоздкий метод будет работать быстрее, чем он же, декомпозированный на тысячу методов. Переход из метода в метод - не самая быстрая операция в .Net Если у вас какая то мания насчет сверхскорости исполнения задач, переходите на чистый C/С++. Преимущество dotNet не в сверхскорости работы программ, а в сверхскорости разработки этих программ. Т. е. никаких рекомендаций про мой первоначальный вопрос дать в мире Дотнета нельзя? Хошь, цельный объект передавай. Хошь, по частям. Всё равно мой код пройдёт через такую кучу интерпретаторов-компиляторов, а возможности котроля не то, что ограничены, а вообще отсутствуют, так что как-то повлиять на конечный результат не представляется возможным? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2012, 23:57 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320а возможности котроля не то, что ограничены, а вообще отсутствуют, так что как-то повлиять на конечный результат не представляется возможным? Ну кое-какие возможности контроля для оптимизации всё-таки есть, например отключение проверки на границы массива. Тут писал: http://codearticles.ru/Home/ArticleView/548 Для этого нужно переключиться в небезопасный код. Но это всё зло, как уже сказали, дотнет не для этого сделан. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 00:03 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Т. е. никаких рекомендаций про мой первоначальный вопрос дать в мире Дотнета нельзя? Хошь, цельный объект передавай. Хошь, по частям. Всё равно мой код пройдёт через такую кучу интерпретаторов-компиляторов, а возможности котроля не то, что ограничены, а вообще отсутствуют, так что как-то повлиять на конечный результат не представляется возможным? почему ж... 1) какой бы не был размер объекта, передача его по ссылке займет одно и тоже время. Ведь указатель - это число. 2) какой бы не был размер объекта, компилятор в режиме релиза попытается оптимизировать ваш код (то, что вы делаете с объектом уже в методе). Скорее всего, все переменные метода, а также часть настроек, с которыми вы работаете, будет раскидана по регистрам процессора. Если вы работаете с этим объектом и не спешите передать его в GC, то какая то часть обязательно попадет в кэш процессора. Но большинство данных программы будет располагаться в оперативке. 3) явно рулить тем, что и где должно быть, просто из .Net вы не сможете 4) попытка экономить на даже не грошах приведет только к а) большому количеству убитого времени б) крайне сложной поддержкой кода в дальнейшем в) с высокой вероятностью такой код будет медленнее, чем "неоптимизированный" вариант. Вы знаете, что оптимизатор SQL сервера в принципе очень даже интеллектуальный? Для управления процессом исполнения запросов MS SQL дает кучу всевозможных опций для оптимизации. Но попытка ими воспользоваться даже для разработчика средней руки приведет только к отрицательным последствиям. Уж слишком узкозаточенным получается запрос. Шаг в сторону - и даже правильно написанный код исполняется в сто и более раз медленнее. А уж переход с версии на версию приводит к мучениям. Так что мой вам совет, бросьте заниматься дурью и если хотите что-то на .Net писать, придерживайтесь Best Practises. Код будет простым, понятным, легким в сопровождении и быстрым. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 00:15 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Изопропилот задачи зависит - на передачу данных в память GPU и обратно тоже нужно время. в некоторых случаях AVX может дать лучший результат если сурьёзно этим заниматься то надо брать видяху с количеством универсальных шрейдеров более 1500. хоть каждый из них слабее ЦПУ, но вся эта толпа должна разнести любой ЦПУ в клочья. будь он трижды Xeon. но , разумеется , это уже не в рамках .Net ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 00:19 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Ну ладно. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 00:19 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-erИзопропилот задачи зависит - на передачу данных в память GPU и обратно тоже нужно время. в некоторых случаях AVX может дать лучший результат если сурьёзно этим заниматься то надо брать видяху с количеством универсальных шрейдеров более 1500. хоть каждый из них слабее ЦПУ, но вся эта толпа должна разнести любой ЦПУ в клочья. будь он трижды Xeon. но , разумеется , это уже не в рамках .Net Я ж говорил, что АМД лутше... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 00:20 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУuser7320а возможности котроля не то, что ограничены, а вообще отсутствуют, так что как-то повлиять на конечный результат не представляется возможным? Ну кое-какие возможности контроля для оптимизации всё-таки есть, например отключение проверки на границы массива. Тут писал: http://codearticles.ru/Home/ArticleView/548 Для этого нужно переключиться в небезопасный код. Но это всё зло, как уже сказали, дотнет не для этого сделан. Говнокод в обработчиках крепчает!!! За такую "оптимизацию" голову отбивать нужно, а в твоем случае, Муслимка, задницу ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 05:36 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Всё равно мой код пройдёт через такую кучу интерпретаторов-компиляторов, а возможности котроля не то, что ограничены, а вообще отсутствуют, так что как-то повлиять на конечный результат не представляется возможным? в твоём случае - да. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 07:24 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
SeVaМСУпропущено... Ну кое-какие возможности контроля для оптимизации всё-таки есть, например отключение проверки на границы массива. Тут писал: http://codearticles.ru/Home/ArticleView/548 Для этого нужно переключиться в небезопасный код. Но это всё зло, как уже сказали, дотнет не для этого сделан. Говнокод в обработчиках крепчает!!! За такую "оптимизацию" голову отбивать нужно, а в твоем случае, Муслимка, задницу Тупая кухарка зрит не в корень, обработчики тут не причём. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 08:02 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-erно , разумеется , это уже не в рамках .Net заблуждение. http://www.opentk.com http://managedcuda.codeplex.com http://www.codeproject.com/Articles/421869/H-264-CUDA-Encoder-DirectShow-Filter-in-Csharp и т д ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 08:18 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Изопропилзаблуждение. понятно , что можно и задницу обернуть в длл обёртку и дёргать её в шарпе. Но! в частности есть язык hlsl. у него свой синтаксис, своя задача. портировать его шарп невозможно без потерь, как в скорости, за которую бъёмся , там и потеря в полноценности. Да, если написать на этом языке нужный метод с параметрами , и потом его дёргать, то ессесно работать будет . но его надо сначала написать. иначе получится какой то франкеншейн, в духе SQL<->ORM, мегасрач по которому тут недавно прошёл ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 08:39 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-erИзопропилзаблуждение. понятно , что можно и задницу обернуть в длл обёртку и дёргать её в шарпе. Но! в частности есть язык hlsl. у него свой синтаксис, своя задача. портировать его шарп невозможно без потерь, как в скорости, за которую бъёмся , там и потеря в полноценности. Да, если написать на этом языке нужный метод с параметрами , и потом его дёргать, то ессесно работать будет . но его надо сначала написать. иначе получится какой то франкеншейн, в духе SQL<->ORM, мегасрач по которому тут недавно прошёл Слишком сильное утверждение. Шейдеры есть wpf/sl. Компилируются отдельно с помощью DirectX SDK, а потом спокойно используются ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 09:00 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
SeVabeg-in-erпропущено... понятно , что можно и задницу обернуть в длл обёртку и дёргать её в шарпе. Но! в частности есть язык hlsl. у него свой синтаксис, своя задача. портировать его шарп невозможно без потерь, как в скорости, за которую бъёмся , там и потеря в полноценности. Да, если написать на этом языке нужный метод с параметрами , и потом его дёргать, то ессесно работать будет . но его надо сначала написать. иначе получится какой то франкеншейн, в духе SQL<->ORM, мегасрач по которому тут недавно прошёл Слишком сильное утверждение. Шейдеры есть wpf/sl. Компилируются отдельно с помощью DirectX SDK, а потом спокойно используются Эка штука получается. Теперь игровой программист может и в каком-нибудь НАСА поработать или каком другом институте ресёрчером, а может ресёрчер в игровую индустрию податься. Если, конечно, и тот и другой изучали HLSL для своих расчётов. Ну, игровец-то понятно, что изучал, а вот ресёрчер. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 13:40 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Roman MejtesЕсли передаешь объект по значению, то объект полностью копируется.Откуда этот бред высосан? При передачи объекта по значению передается исходный указатель на объект, который можно перезаписать в вызываемой функции. А по ссылке — копия указателя. Объект один и тот же, никакого "копирования" объекта не происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 13:53 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
AntonariyRoman MejtesЕсли передаешь объект по значению, то объект полностью копируется.Откуда этот бред высосан?Объект может оказаться структурой. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 13:55 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Алексей КAntonariyпропущено... Откуда этот бред высосан?Объект может оказаться структурой.По волшебству что ли? Это в js сплошь и рядом, а в строго типизированном языке написание процедуры, принимающей что попало (причем по ссылке) и потом это разруливающей, является признаком говнокодинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 14:02 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
AntonariyАлексей Кпропущено... Объект может оказаться структурой.По волшебству что ли?Причём тут "волшебство"? Приведён пример, когда в C# "объект полностью копируется". AntonariyЭто в js сплошь и рядом, а в строго типизированном языке написание процедуры, принимающей что попало (причем по ссылке) и потом это разруливающей, является признаком говнокодинга.Из непонятого... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 14:56 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Алексей КПриведён пример, когда в C# "объект полностью копируется".Где? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 15:55 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
AntonariyАлексей КПриведён пример, когда в C# "объект полностью копируется".Где? Ты чё тупишь, чудило? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 16:04 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
AntonariyАлексей КПриведён пример, когда в C# "объект полностью копируется".Где?Что? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 16:18 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
[quot Antonariy]Алексей Кпропущено... Объект может оказаться структурой.По волшебству что ли? Структура - наследний объекта, поэтому если в функцию, принимающую тип object ты будешь передавать структуру, то будет полное копирование этого "объекта". ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 16:29 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Алексей КAntonariyпропущено... Где?Что? Этот товарисч недавно осилил что такое IEnumerable, а ты ему про структуры вещаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 16:47 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУАлексей Кпропущено... Что? Этот товарисч недавно осилил что такое IEnumerable, а ты ему про структуры вещаешь.Ага, видел. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 16:53 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Алексей КСтруктура - наследний объекта, поэтому если в функцию, принимающую тип object ты будешь передавать структуру, то будет полное копирование этого "объекта".Ну так это частный случай для структур. В общем же случае объект не копируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 17:05 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Алексей К blest ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 17:06 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУ, Гумно тема Автору читать тынц аки FastCall в низу страницы сам не проверял, но уверен что правда. зы Пил... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 17:07 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Где-то в степиГумно тема +1 Где-то в степизы Пил... Ну вот... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 17:20 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Где-то в степиМСУ, Гумно тема Автору читать тынц аки FastCall в низу страницы сам не проверял, но уверен что правда. зы Пил... Кстати классная статья. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 17:24 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
МСУ, Я вчера пробовал читать, кеш да кеш, какой кеш? и даже согласился с автором. что при передаче по ссылки весь объект из кучи грузим в стек и долго ночью ворочался в досаде - почему они так сделали..., а оно вон видишь как......... )) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.12.2012, 17:34 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Доброго времени суток. Автор статьи, о которой говорит автор, имеет ввиду следующее. На концептуальном уровне это все выглядеть как IL,GC,stack, но это все концептуально. Под капотом все таки крутится набор команд процессора (IL --JIT---> asm), которые оперируют регистрами, константами, и адрессацией в памяти. И таки эти команды ничего не знают про GC для них это просто ячейки памяти, кеш, регистры. И значение переменной в конкретно взятый момент запросто может сидеть в памяти или регистре или в кеше. Так вот в силу, вероятно известных автору статьи фактов, позволяющих делать ему предположения о том, во что в итоге трансформируется код в той или иной версии фреймворка, автор статьи и говорит - старайтесь держаться в кеше процессора. В инете полно статей про всякий deep inside. Автор вопроса задал правильный вопрос. И он очень интересен. Автор вопроса молодец. Другое дело, что на практике в целях оптимизации выгоднее положиться на более детерменированный сценарий C++ с ассемблерными вставками. А если это нужно использовать из. net, то это может быть обертка на c++/cli или pinvoke. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 02:22 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Судя по тому, что я начитался, обратиться к кешу процессор напрямую (указать адрес в кеше, например) нельзя даже из ассемблера. Это внутренняя вотчина процессора и он сам ей управляет. Тогда единственный плюс ассемблерных вставок по отношению к попыткам "уложиться в кеш" на языке высокого уровня под виртуалной машиной (Дотнет, например), это то, что есть гарантия, что на ассемблере кроме тех данных, что вы используете в данный момент, виртуальная машина не потащит в кеш ещё чего-нибудь. Т. е. для виртуальной машины и разных высокоуровневых библиотек по отношению к объёмам кеша процессора надо вводить понятие "доступно пользователю", как в своё время на коммуникаторах с маленькой памятью было. Скажем, кеш 7 МБ, а при программировании под виртуальной машиной он постоянно на 3 МБ забит всякими служебными данными вертуальной машины. Так что попытки уложиться в 7 МБ могут просто ни к чему не привести. Но при этом непонятно, как отследить, сколько в данный момент отправлено служебных данных. Если вызывать функции, показывающие, сколько в данный момент памяти занимает такой-то объект, то это будет относиться только к ОЗУ, а не к кешу, как я понимаю. Т. е. такие попытки мониторинга для высокоуровневых систем обречены на провал без специальных инструментов (которых, может, и нет). Ну т. е. да, согласен с автором выше, что лучше не заморачиваться "экономией памяти" в Дотнете и использовать более контролируемые в этом смысле ассемблерные вставки. Хотя, опять же, понятие "доступно пользователю" бы не помешало, ибо использование обёрток не загромождает ли кеш так же служебными данными, как и при попытках "экономить" чисто под виртуальной машиной? Ведь вызоввы этих обёрток происходят всё равно из-под виртуальной машины. И ещё вопрос. Как я понимаю, под ассемблером вы понимаете именно процессорный ассемблер, а не какой-нибудь CIL? На CIL распространяется вся эта виртуальщина со сборками мусора и управляемостью, да? Тогда вопрос: какое может быть преимущество в написании каких-нибудь кусков кода непосредственно на CIL? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 08:46 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320 какое может быть преимущество в написании каких-нибудь кусков кода непосредственно на CIL? вы определитесь , што вам треба, какая задача стоит. а уж потом лезте в методы решения. максимальное быстродействие можно достичь целым спектром методов, помимо асма. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 08:52 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-eruser7320 какое может быть преимущество в написании каких-нибудь кусков кода непосредственно на CIL? вы определитесь , што вам треба, какая задача стоит. а уж потом лезте в методы решения. максимальное быстродействие можно достичь целым спектром методов, помимо асма. Т. е. при определённых условиях много есть каких преимуществ при написании кода на CIL вместо какого-нибуди СиШарпа, помимо чисто академических целей "а как же это работает там внутри"? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 11:05 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Скажем, кеш 7 МБ, а при программировании под виртуальной машиной он постоянно на 3 МБ забит всякими служебными данными вертуальной машины. Так что попытки уложиться в 7 МБ могут просто ни к чему не привести. А тест вообще пробовал какой-нибудь замутить? Ну типа делаем много всякой арифметики над куском в метр, потом следующий, еще один и т.д. Потом по два метра тоже самое. Потом по 4. И проанализировать отличия по времени. Одной и той же длительной работы, но с разной порционностью. Главное, чтобы она действительно была одна и та же (в сумме над всеми данными). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 14:29 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Edd.Dragonuser7320Скажем, кеш 7 МБ, а при программировании под виртуальной машиной он постоянно на 3 МБ забит всякими служебными данными вертуальной машины. виртуальной машины нет, есть нативный исполняемый код как результат JIT компиляции. временные переменные на стеке при нехватке регистров или для обмена с FPU -точно такие же как и при обычной компиляции с языков типа Паскаль и С. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 14:35 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Edd.Dragon, это к user7320, ошибся при цитировании ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2012, 14:36 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Ну ладно, а есть ли разница при передаче очень большого очень составного объекта (десятки мегабайт) по ссылке и маленького (в пределах одного килобайта)? Я к тому, что можно ли ради универсальности передавать всегда один и тот же объект в разные функции и функции уже сами там будут с нужными его полями работать, или лучше выбирать конкретное поле и передавать по ссылке только его? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 21:04 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320МСУпропущено... Стоп, давай определимся с терминами. Что ты имеешь ввиду по словом "кеш"? Покажи пример кода, как ты кешируешь данные. Кеш - это кеш процессора. Я не знаю, когда я кеширую данные. В том-то и штука. Как я из СиШарпа узнаю, что я данные в данный момент кеширую? Я могу только сказать, что если я в данные момент работаю с какой-то переменной, то её значение и её адрес прошли через кеш. авторЕще раз - давай на пальцах (с примерами кода), откуда, что и как ты получаешь в виде исходных данных. У меня есть класс в отдельной сборке, в котором есть основная функция расчёта. Программа загружает мою сборку и передаёт моей функции один объект, который содержит в своих полях и настройки, и массивы данных. Моя функция расчёта по мере продвижения этого расчёта берёт разные части входящего объекта. Ну вот, например, не придираясь к правильности кода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Буквари я погуглю про кучи и управление памятью, но попозже. Прежде, чем озадачиваться оптимизацией на уровне регистров, лучше разобраться, что происходит во время такого косяка как list.add. Одно это убьет всю производительность на корню. Первый принцип разработки эффективного кода на net - минимизация выделения памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 22:00 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
SeVaПрежде, чем озадачиваться оптимизацией на уровне регистров, лучше разобраться, что происходит во время такого косяка как list.add. Одно это убьет всю производительность на корню. Первый принцип разработки эффективного кода на net - минимизация выделения памяти. Эмм... ну а что со списком и конкретно с добавлением в него элементов можно сделать, кроме как во время создания указать фиксированный размер? И меня всё равно интересует вопрос в моём предыдущем посте - есть ли разница при передаче по ссылке объектов разного размера? Если ли разница, передавать в функцию один большой объект по ссылке и считывать нужные свойства, или лучше эти свойства по отдельности в параметры загнать? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 10:38 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Если ли разница, передавать в функцию один большой объект по ссылке и считывать нужные свойства, или лучше эти свойства по отдельности в параметры загнать? сферический конь в вакууме. Где лучше, для чего лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 11:08 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Эмм... ну а что со списком и конкретно с добавлением в него элементов можно сделать, кроме как во время создания указать фиксированный размер?Мне кажется, что ничего. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 12:32 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Изопропилuser7320Если ли разница, передавать в функцию один большой объект по ссылке и считывать нужные свойства, или лучше эти свойства по отдельности в параметры загнать? сферический конь в вакууме. Где лучше, для чего лучше? Лучше с точки зрения производительности, потребления памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 16:40 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Лучше с точки зрения производительности, потребления памяти. это называется преждевременная оптимизация. Узкое место вызовы и передача параметров? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 23:37 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320SeVaПрежде, чем озадачиваться оптимизацией на уровне регистров, лучше разобраться, что происходит во время такого косяка как list.add. Одно это убьет всю производительность на корню. Первый принцип разработки эффективного кода на net - минимизация выделения памяти. Эмм... ну а что со списком и конкретно с добавлением в него элементов можно сделать, кроме как во время создания указать фиксированный размер? И меня всё равно интересует вопрос в моём предыдущем посте - есть ли разница при передаче по ссылке объектов разного размера? Если ли разница, передавать в функцию один большой объект по ссылке и считывать нужные свойства, или лучше эти свойства по отдельности в параметры загнать? Эмм... учи net: yeild, отложенное выполнение. Пройдись рефлектором по своему list.add, очень много интересного увидишь, сразу поймешь, что про регистры можно забыть ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 23:45 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Изопропилuser7320Лучше с точки зрения производительности, потребления памяти. это называется преждевременная оптимизация. Узкое место вызовы и передача параметров? Да кто его знает. Лучше у умных людей заранее спросить, стоит делать то-то или не стоит. SeVauser7320пропущено... Эмм... ну а что со списком и конкретно с добавлением в него элементов можно сделать, кроме как во время создания указать фиксированный размер? И меня всё равно интересует вопрос в моём предыдущем посте - есть ли разница при передаче по ссылке объектов разного размера? Если ли разница, передавать в функцию один большой объект по ссылке и считывать нужные свойства, или лучше эти свойства по отдельности в параметры загнать? Эмм... учи net: yeild, отложенное выполнение. Пройдись рефлектором по своему list.add, очень много интересного увидишь, сразу поймешь, что про регистры можно забыть Да я уже забыл про регистры. Вы просто скажите, есть разница передавать по ссылке большие или маленькие объекты в функцию? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 11:17 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320есть разница передавать по ссылке большие или маленькие объекты в функцию нет. потому что передается сама ссылка, а не объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 11:32 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Так. А теперь: что лучше с точки зрения производительности и потребления памяти: считать с большого объекта поля и передать их в функцию по ссылкам как параметры, или передать этот объект по ссылке как параметр, а в функции уже считывать его поля? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 16:53 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320, Это знаете как в том анекдоте про чукчу Чукча пришел на экскурсию на фабрику где конфеты мастерят, ну его водят по цехам, всю технологию разжевывают на выходе: -Понял? -Ага, только не понятно, как начинка внутри конфеты оказывается.. Есть еще старый студенческий коломбур жутко матерный ( на бис) Зы сделайте консоль и посмотрите как компилятор оптимизирует ваш код, и что будет лежать в стеке, если все это не понятно ( стеки, указатель, куча .....) зачем все это спрашивать, если ответ все равно уже дали выше а до вас не дошло.. Я это сказал без обид, Вам о этом рано рассуждать, вам базу учить надо.. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 17:12 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Так. А теперь: что лучше с точки зрения производительности и потребления памяти: считать с большого объекта поля и передать их в функцию по ссылкам как параметры, или передать этот объект по ссылке как параметр, а в функции уже считывать его поля? кроче, с таким подходом к вопросу производительности ваш код будет всегда хуже , нежеле копилятор в лоб сделает. в вопросах оптимизации сначала идёт задача, а уже потом попытки её ускорения. да , и ещё. плохо реализованный , но великолепный алгоритм, будет работать быстрее отлично реализованного , но слабенького алгоритма. на затравку Код: c# 1. 2. 3.
во сколько раз второй цыкл будет работать дольше. так , в уме прикинньте. а потом проверьте на компе ))) вот так просто может развалится вся оптимизация. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 17:23 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Так. А теперь: что лучше с точки зрения производительности и потребления памяти: считать с большого объекта поля и передать их в функцию по ссылкам как параметры, или передать этот объект по ссылке как параметр, а в функции уже считывать его поля? С точки зрения производительности и потребления памяти при прочих идеальных условиях и некриворуковсти программиста все идентично. Но исходя из ваших вопросов я советую использовать одну ссылку на большой объект и доставать всё, что нужно из него. В первом варианте есть большая вероятность, что вы наделаете ошибок Но если брать в общем, то подход стандартный - передавать в функцию только нужные ей параметры, чтобы избежать повреждения данных. Помимо прочего это позволит методу быть статичным ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 17:27 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-erво сколько раз второй цыкл будет работать дольше. так , в уме прикинньте. а потом проверьте на компе ))) вот так просто может развалится вся оптимизация. Я только знаю, что конкатенация работает очень медленно. Поэтому везде в руководствах пишут, что надо умещать всю строку в одну, когда это можно. И если компилятор может заранее склеить строки, которые конкатенацией образованы из-за того, что в экран одна большая строка не влезла, когда программист код писал, то в других случаях он может и не догадаться. Я вообще сейчас уже начал не для вопросов особого быстродействия спрашивать, а просто для интереса. Получается, что разница реально в основном только в том, что в случае кучи разных полей, переданных в качестве параметров, будет просто больше переменных занято на хранение ссылок (адресов), чем когда один объект? Это всё? авторЕсть еще старый студенческий коломбур жутко матерный ( на бис) Зы сделайте консоль и посмотрите как компилятор оптимизирует ваш код У меня из студенческого вспоминается только эпитаксия и барьер Шоттки, и то я их забыл уже давно. ))) Всем спасибо, что повозились со мной. Я трудный. )) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 20:03 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Я только знаю, что конкатенация работает очень медленно. ну если там проблема только в сложении строк, попытайтесь оптимизировать алгоритм. так, что бы в памяти болталось 2.000.000 объектов, содержащих строку. что бы время было как можно ближе к первому цыклу. сделайте, и тогда поймёте , что количество передаваемых параметров , если и влияет на скорость, то настолько незначительно , что этим можно пренебречь. вам же просто для интереса. ну вот и дерзайте. надеюсь после решения этой задачки , странных вопросов будет меньше. зы. проблема там ессесна не только в конкатенации ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 20:28 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-er, Ну, насколько я знаю, рекомендуют использовать СтрингБилдер и Аппенд. Конкатенация создаюёт каждый раз новую строку - выделение памяти и всё такое. Испытывать ваш пример не стал - неохота. Извините. )) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 21:04 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Ну, я ещё могу предположить, что поскольку вы перезаписываете SSS, и при этом значениями, бОЛьшими по длине, чем были, то надо будет сделать реорганизацию оперативной памяти (дефрагментация и прочее) - т. е. сборщик мусора начнёт тормозить программу. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 21:09 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Ну, я ещё могу предположить, что поскольку вы перезаписываете SSS, и при этом значениями, бОЛьшими по длине, чем были, то надо будет сделать реорганизацию оперативной памяти (дефрагментация и прочее) - т. е. сборщик мусора начнёт тормозить программу. опять мимо кассы. размер нового значения не имеет значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 22:18 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Надо в оптимизаторе отключить проверку на выход за границы массива? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 22:24 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Надо в оптимизаторе отключить проверку на выход за границы массива? тебе - не надо ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 22:27 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Испытывать ваш пример не стал - неохота. Извините. )) а зачем спичь о скорости , если с простейшей задачей оптимизации не можешь справиться. скорость работы второго цыкла легко и непринуждённо увеличивается как минимум втрое. ( проверка на размер массива не поможет). а можно ускорить и ещё в большее число раз. до 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 22:32 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320чем были, то надо будет сделать реорганизацию оперативной памяти короче, оптимальное решение задачи - оптимизации выполнения 2го цыкла будет по времени практически такое же, что и исполнение первого цыкла. затраты на решение = максимум 2 минуты. когда сделаете, поймёте , что не в регистрах щастье. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2013, 23:16 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-eruser7320чем были, то надо будет сделать реорганизацию оперативной памяти короче, оптимальное решение задачи - оптимизации выполнения 2го цыкла будет по времени практически такое же, что и исполнение первого цыкла. затраты на решение = максимум 2 минуты. когда сделаете, поймёте , что не в регистрах щастье. Речь не идёт об unsafe-коде? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 04:48 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Речь не идёт об unsafe-коде?в данном случае , можно и без него. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 07:02 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
1. Я просто удаляю первый цикл как бесполезный - всё равно второй делает то же самое и больше. 2. Я заменяю всю эту фигню одной функцией, которая принимает параметр - число, и возвращает вот эту строку, которую вы два миллиона раз пишете, сконкатенованную с числом-параметром. 3. Это вопрос с заковыкой. Правильный ответ - не думать об этом вопросе. Таким образом можно реально ускорить производительность и разработку другого, более умного кода, просто перестав думать о более глупом. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 08:21 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-erчто не в регистрах щастье а в их количестве :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 09:20 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user73203. Правильный ответ - не думать об этом вопросе. так и запишем - студенту низачьод. не справился с элементарной задачей оптимизации. причём задачей не абстрактной , а в полне конкретной. в жизни встречающейся. Изопропила в их количестве :) взвестье полкило ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 10:05 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Я удалил ненужный цикл и вообще заменил его функцией. Вы же на сказали, для каких задач этот массив нужен. Если вам постоянно нужны два миллиона строк с возрастающих числом на конце, то это одно. А если время от времени строка с числом на конце - то функция с параметром (в виде лямбды-делегата) лучший выход. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 10:35 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
user7320Я удалил ненужный цикл и вообще заменил его функцией. Вы же на сказали, для каких задач этот массив нужен. Если вам постоянно нужны два миллиона строк с возрастающих числом на конце, то это одно. А если время от времени строка с числом на конце - то функция с параметром (в виде лямбды-делегата) лучший выход. не можете решить конкретную задачу - максимально быстро получить 2.000.000 объектов индексированных строк.( а по сути рещить проблему сложения строк и конверсии числа в строку ) - так и напишите не можу решить элементарных вещей. а задача - происходит пиковая нагрузка. и нужно за короткое время принять сообщения. нужно что бы кажое сообщение не переплелось с другим. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 10:53 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-er, А можно показать как легко и непринужденно уменьшить время исполнения второго цикла хотя бы в 10 раз, безо всяких оптимальных решений, когда время выполнения второго цикла "будет по времени практически такое же, что и исполнение первого цыкла". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 13:47 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
Без unsafe. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 13:56 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
enigmaticbeg-in-er, А можно показать как легко и непринужденно уменьшить время исполнения второго цикла хотя бы в 10 раз, а не покажу. то было мысленное решение в 10 раз, оценочное. на компе появилось решение получше. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2013, 14:47 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-er, Показывайте. А я покажу что есть у меня. В общем, у нас есть исходный вариант (0.07s) и плохой вариант (1s), плохой вариант медленнее исходного в ~15 раз. Нам нужно оптимизировать плохой вариант. Первым делом избавляемся от боксинга q, время выполнения снижается до 0.9s, т.е. на 10%. Затем предположим, что мы написали лучший метод, чем string.Concat и избавились от конкатенации строк с нулевыми потерями производительности, получаем время выполнения 0.59s, но это даже не вдвое меньше чем исходный плохой вариант. Дальше остается оптимизировать int.ToString(), который использует нативную функцию для конвертации числа в строку, а нам нужно сделать быстрее. Может я где-то очевидную ошибку допускаю? Всё-таки оптимизацией приходится редко заниматься. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 07:42 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
enigmatic, ну я тоже не каждый день провожу оптимизацию в 1.000 раз 13782217 в начале я думал просто в байты перевести и потом шлёпать в хвост байт-строки какой-то разделитель и 4 байта числа. а потом , когда попробывал что то сделать , пришло другое решение Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
тупо , в лоб. но за тоже время, что и время работы первого цыкла, получаем при обращении к памяти нужную строку. тупо , на первоначальном этапе избавился от сложения и приведения числа в строку. в этом наверно и есть оптимальность решения. как то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 08:53 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
beg-in-er, Ну это вообще лол. Пройдите по этому массиву полностью один раз и по времени на то и выйдет. Подразумевалось же, что массив нужен весь и сразу. >в этом наверно и есть оптимальность решения Оптимальность решения в том, что вы не считаете всё и сразу, а выдаёте результат малыми порциями. А решение у вас хорошее, мне понравилось. В отличие от кода =) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 09:21 |
|
А много ль затрат при передаче огромных объектов по ссылке?
|
|||
---|---|---|---|
#18+
enigmatic, авторПодразумевалось же, что массив нужен весь и сразу. неа, я написал несколько не так: что бы в памяти болталось 2.000.000 объектов, содержащих строку Z_class[0] же содержит строку . ну это казуистика. а код мне и самому не нравится. но что то не было желания его причесать. а решение да, мне и самому по душе. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2013, 09:51 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1405345]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
132ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 249ms |
0 / 0 |