N>>>"Working set" — это Обстракция. Это термин, который каждый понимает по-разному. Я бы его не использовал. PD>>Это не абстракция. Это совершенно четкий параметр : количество страниц процесса, находящееся в данный момент в ОП.
N>А. То есть это resident set. А не какой-то абстрактный working set.
Заметь, как всего за 2 сообщения он легко и изящно ушел с обсуждаемой темы. А ты повелся. Аяяяй
Здравствуйте, netch80, Вы писали:
N>А. То есть это resident set. А не какой-то абстрактный working set.
Термин Working Set это устоявшийся термин, если чо.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[27]: ответ на вопрос: Почему новые программы работают мед
Здравствуйте, Mamut, Вы писали:
N>>А. То есть это resident set. А не какой-то абстрактный working set. M>Заметь, как всего за 2 сообщения он легко и изящно ушел с обсуждаемой темы. А ты повелся. Аяяяй
Щас вернём!
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[15]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, Pavel Dvorkin, Вы писали:
НС>>Главное — он либо не зависит или слабо зависит от размера исходников, что раньше и было (зависимость < O(N)), либо зависит сильно, что сейчас встречается чаще. Причем бывают очень тяжелые случаи, типа вложенных лямбд в шарпе, для которых алгоритм без эвристик, емнип, O(N^4). В эпоху 1 мегабайта таких фич не было в промышленных языках.
PD>Объем данных N^4 ? Что за структуры такие ? Четырехмерные массивы строятся ?
Кстати, интересно, что если лямбда содержит вложенные лямбды, то это процесс может вызываться рекурсивно. Я, кажется, когда-то приводил пример, когда это вызывает комбинаторный взрыв:
А вот другой пример, в котором программа в 62 байта напрягает компилятор шарпа так, что современный процессор жжет кислород около минуты Re[6]: [Этюд, C#] Долгая компиляция
class X<A,B,C,D,E>{class Y:X<Y,Y,Y,Y,Y>{Y.Y.Y.Y.Y.Y.Y.Y.Y y;}}
PD>Но как из исходного файла в 1 Мб образуется объем промежуточных данных, скажем, в 100 Мб — твой ликбез не объясняет.
Вот последний пример, кроме долгой компиляции, порождает сборку размером почти в 28 Мб.
И, как уже сказали, паскаль из 90-х, который работал при 1 Мб и современный компилятор вещи отнюдь не аналогичные, у них сложность структуры обрабатываемых данных совершенно другого порядка.
... << RSDN@Home 1.2.0 alpha 5 rev. 43>>
Re[27]: ответ на вопрос: Почему новые программы работают мед
Здравствуйте, Mamut, Вы писали:
N>>А. То есть это resident set. А не какой-то абстрактный working set. M>Заметь, как всего за 2 сообщения он легко и изящно ушел с обсуждаемой темы. А ты повелся. Аяяяй
А я на подобные "уводы" реагирую просто как на отсутствие ответа. У меня нет цели "зафиксировать" какое-то незнание или другое качество собеседника, и так понятно, какой результат.
The God is real, unless declared integer.
Re: ответ на вопрос: Почему новые программы работают меделнно
Я вполне допускаю, что на вложенных лямбдах все может сильно тормозить. Более того, если дело дойдет до LinQ, то тормозить уже может не только компилятор, а и рабочая программа, причем так, что и в кошмарном сне не приснится
Только вот в С++ до VS2010 не было лямбд никаких вообще. В моей программе, о которой я говорил, что для ее трансляции нужно 15-25 Мб, их, естественно, тоже нет.
Так что с вложенными лямбдами пусть хоть экспонента по памяти. Почему без лямбд N^4 ?
With best regards
Pavel Dvorkin
Re[27]: ответ на вопрос: Почему новые программы работают мед
Здравствуйте, Pavel Dvorkin, Вы писали:
N>>А. То есть это resident set. А не какой-то абстрактный working set. PD>Называй как хочешь. Я привык к понятию working set (рабочее множество, рабочий набор). N>>Я, конечно, понимаю стремление MS всё обозвать по-своему, но потом приходится бороться с последствиями этого. PD>Вот тут ты не прав. Я этот термин знал раньше, чем узнал о существовании MS . Вроде как здесь прочитал
В VMS, судя по рассказам её поклонников, это значит все аллоцированные страницы процесса. Что логичнее.
И отсутствие этого термина в современных Unix наводит на мысли, что от него избавились.
PD>Дейтел Г. Введение в операционные системы. М.: Мир. 1987.
Одного автора недостаточно.
The God is real, unless declared integer.
Re[17]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Я вполне допускаю, что на вложенных лямбдах все может сильно тормозить.
Я примеры привел не только с лямбдами, там еще есть дженерики.
PD>Более того, если дело дойдет до LinQ, то тормозить уже может не только компилятор, а и рабочая программа, причем так, что и в кошмарном сне не приснится
PD>http://rsdn.ru/forum/flame.comp/4098976.1.aspx
О да, помню, помню. Взять для примера крайне неоптимальную структуру данных, использовать неоптимальный алгоритм, а потом удивляться проседанию производительности на несколько порядков, в чем конечно же повинен только линк! Странно, что в том примере БД не использовали поверх WCF запущенной на каком-нибудь эмуляторе устройств в виртуальной машине в сетке с пингом до нескольких секунд и скоростью в 9600 бод!
Неужели здравый смысл не подсказывает разобраться в том, что происходит на самом деле, прежде, чем набрасываться с обвинениями в чудовищно низкой производительности линка. Так как на чем ни реализуй алгоритм маляра Шлемиля, все равно в итоге будет получаться не эффективно. Там же по ссылке я переписал этот пример, заменив в нем только структуру данных, и в результате, буквально в одно мгновение, цифры уменьшились с нескольких порядков до 1.
Что касается использования самого линка, его, как и любую другую технологию или даже алгоритм, следует использовать там, где от него есть выгода. В твоем примере, от него нет никакой пользы, только вред, и не только в плане производительности, но и в понятности. Думаю никто не станет спорить (хотя, зная насколько человек бывает иррациональным, сильно не удивлюсь, ибо флеймы в КСВ это уже не раз доказывали ) с тем, что в примере ниже 1 вариант понятен даже не напрягая извилины в отличие от второго, в котором желание автора кода еще нужно с уметь распарсить.
for (int i = 0; i < size; i++)
a[i] = i + 1;
vs
var result = a.Aggregate(
empty,
(acc, res) =>
acc.Count() == 0
? new[] { res }
: acc.Concat(new[] { res + acc.Last() }));
Но это же не значит, что теперь линк не нужен, ибо вот пример, иллюстрирующий обратное, его не только писать быстрее, но и читать, что более важно:
var sum = 0
for (var i = 0; i < a.Length; i++)
sum += a[i];
vs
var sum = a.Sum();
Конечно, чем сложнее структура, тем выбор того или иного алгоритма и подхода (императивный, декларативный, функциональный) сильнее сказывается на скорости и читаемости. Вот недавний пример в форуме Философия программирования Красиво избежать побочных эффектов
int cOwnSeen = 0;
for (item : items)
if (item.owner != myself || cOwnSeen++ < limit)
processItem(item);
Все попытки изобразить алгоритм в функциональном стиле с сохранением семантики страдают сильной избыточностью так, что за деревьями леса не видно, то бишь, самого алгоритма.
Ну так вот, я отвлекся, по поводу использования линка. Он используется там, где его декларативность заруливает в минуса императив (верно и наоборот!). Вот здесь Игорь привел пример использования линка Re[10]: Давайте поговорим о c# 3.0
. Оцени, код на линке почти в 4 раза меньше императивного, при этом, что очень важно, он понятен в отличие от своего императивного собрата, который даже в один экран не влезает.
PD>Только вот в С++ до VS2010 не было лямбд никаких вообще. В моей программе, о которой я говорил, что для ее трансляции нужно 15-25 Мб, их, естественно, тоже нет.
О какой программе идет речь, и где ты об этом говорил?
PD>Так что с вложенными лямбдами пусть хоть экспонента по памяти. Почему без лямбд N^4 ?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Я вполне допускаю, что на вложенных лямбдах все может сильно тормозить. Более того, если дело дойдет до LinQ, то тормозить уже может не только компилятор, а и рабочая программа, причем так, что и в кошмарном сне не приснится
PD>http://rsdn.ru/forum/flame.comp/4098976.1.aspx
Здравствуйте, MxMsk, Вы писали:
MM>Надо бы набросать здесь еще какой-нибудь дебильный код, чтобы на следующие два года был говно-пример.
Лучше бы нормальный пример сразу приводили.
А то фиг вас знает, может вы там все именно так и пишете, а когда выяснилось что говнокод то стали оправдываться что это дескать шутка была.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[18]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, rameel, Вы писали:
R>О да, помню, помню. Взять для примера крайне неоптимальную структуру данных, использовать неоптимальный алгоритм, а потом удивляться проседанию производительности на несколько порядков, в чем конечно же повинен только линк! Странно, что в том примере БД не использовали поверх WCF запущенной на каком-нибудь эмуляторе устройств в виртуальной машине в сетке с пингом до нескольких секунд и скоростью в 9600 бод!
Нет. Там ниже по теме я задал вполне конкретный вопрос — что мне предпринять, чтобы гарантированно не попасть в эту ситуацию. Ответа на него не последовало. Можешь — дай его, пожалуйста. Нет — значит, что-то и впрямь неладно в Датском королевстве.
R>Неужели здравый смысл не подсказывает разобраться в том, что происходит на самом деле, прежде, чем набрасываться с обвинениями в чудовищно низкой производительности линка. Так как на чем ни реализуй алгоритм маляра Шлемиля, все равно в итоге будет получаться не эффективно. Там же по ссылке я переписал этот пример, заменив в нем только структуру данных, и в результате, буквально в одно мгновение, цифры уменьшились с нескольких порядков до 1.
Замечательно. Я и не утверждаю, что с линком нельзя написать более или менее неэффективно. Но вот без него написать столь неэффективно попросту нельзя. Поэтому еще раз задаю тот же вопрос.
R>Что касается использования самого линка, его, как и любую другую технологию или даже алгоритм, следует использовать там, где от него есть выгода. В твоем примере, от него нет никакой пользы, только вред, и не только в плане производительности, но и в понятности.
Пример не мой, его предложил кто-то, я лишь его протестировал.
R>Но это же не значит, что теперь линк не нужен, ибо вот пример, иллюстрирующий обратное, его не только писать быстрее, но и читать, что более важно: R>
R>var sum = 0
R>for (var i = 0; i < a.Length; i++)
R> sum += a[i];
R>vs
R>var sum = a.Sum();
R>
PD>>Только вот в С++ до VS2010 не было лямбд никаких вообще. В моей программе, о которой я говорил, что для ее трансляции нужно 15-25 Мб, их, естественно, тоже нет.
R>О какой программе идет речь, и где ты об этом говорил?
Да все о той же, для которой 15-25 Мб для компиляции требуется.
PD>>Так что с вложенными лямбдами пусть хоть экспонента по памяти. Почему без лямбд N^4 ?
R>А где сказано, что без лямбд потребление памяти N^4? Я такого в тексте нигде не вижу. Про N^4 речь шла именно о вложенных лямбдах.
Ok, бог с ними, вложенными лямбдами. Без них — O(N^?) . Чему равен "?"
With best regards
Pavel Dvorkin
Re[18]: ответ на вопрос: Почему новые программы работают меделнно
! Надо бы набросать здесь еще какой-нибудь дебильный код, чтобы на следующие два года был говно-пример.
Надо дать то, чего я еще тогда добивался и сейчас опять добиваюсь — правил, как избежать попадания в такую ситуацию. Иначе как мне узнать (без запуска) — дебильный будет код или нет ?
Для императивного кода в большинстве случаев можно сказать, что тут будет — O(N), O(NlgN), O(N^2), O(2^N)...
Вот и дай мне такой же способ оценить зависмость t=f(N) для линка. Тогда и вопросов не будет и дебильного кода тоже.
Здравствуйте, Трололоша, Вы писали:
Т>Лучше бы нормальный пример сразу приводили.
Да никто не стал бы использовать Linq. Какой нужно привести для этого пример?
Т>А то фиг вас знает, может вы там все именно так и пишете, а когда выяснилось что говнокод то стали оправдываться что это дескать шутка была.
Я в конце ветки объяснил, почему это был стеб изначально. Просто некоторым очень хочется убедить себя, что Linq — говно, вот они и видят то, что хотят.
Re[20]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, MxMsk, Вы писали:
Т>>Лучше бы нормальный пример сразу приводили. MM>Да никто не стал бы использовать Linq. Какой нужно привести для этого пример?
Не надо было вообще писать того кода.
Т>>А то фиг вас знает, может вы там все именно так и пишете, а когда выяснилось что говнокод то стали оправдываться что это дескать шутка была. MM>Я в конце ветки объяснил, почему это был стеб изначально.
Что было потом, никому уже не интересно. Народ ссылается на изначальное сообщение а там адЪ и угар.
MM>Просто некоторым очень хочется убедить себя, что Linq — говно, вот они и видят то, что хотят.
А он и есть говно, когда используется не к месту.
И именно пример такого использования был подогнан, но в ином контексте.
Теперь на него ссылаются.
Первый раз вижу чтоб так сами себя затроллили.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[19]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Надо дать то, чего я еще тогда добивался и сейчас опять добиваюсь — правил, как избежать попадания в такую ситуацию. Иначе как мне узнать (без запуска) — дебильный будет код или нет ? PD>Для императивного кода в большинстве случаев можно сказать, что тут будет — O(N), O(NlgN), O(N^2), O(2^N)...
А как ты это определяешь, сложность для императивного кода?
Re[16]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Надо дать то, чего я еще тогда добивался и сейчас опять добиваюсь — правил, как избежать попадания в такую ситуацию. Иначе как мне узнать (без запуска) — дебильный будет код или нет ? PD>>Для императивного кода в большинстве случаев можно сказать, что тут будет — O(N), O(NlgN), O(N^2), O(2^N)... MM>А как ты это определяешь, сложность для императивного кода?
Не понял. Ты хочешь, чтобы я тебе лекцию прочитал о зависимости t=f(N) для разных алгоритмов, начиная с линейного поиска и кончая NP-полными задачами ? Так об этом столько понаписано...
Для той пресловутой задачи : линейный цикл, поэтому O(N).
With best regards
Pavel Dvorkin
Re[21]: ответ на вопрос: Почему новые программы работают меделнно
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Не понял. Ты хочешь, чтобы я тебе лекцию прочитал о зависимости t=f(N) для разных алгоритмов, начиная с линейного поиска и кончая NP-полными задачами ? Так об этом столько понаписано...
Я хочу сказать, что оценка времени даже линейного цикла базируется на некотором знании о том, как этот цикл реализуется компилятором. То же самое и с Linq. Чтобы оценить сложность, нужно понимать, во что компилируются соответствующие методы. Как правило, имеем те же O(N). Более высокая сложность может получиться при наличии вложенных вызовов. В сущности, те же самые правила