уже Трурль указывал. Не 50К там, а 50К*50К, почувствуйте разницу что называется. А 50К можете сами взять и проверить, все матчится мгновенно.
HDL>Пардон, невнимательно посмотрел. То есть, если не ошибаюсь, там матчили списковые структуры по 18 гигобайт
50K*50K = 2500M = 2,5G.
Размер списка чисел = размер слова * 2 * количество элементов = 16 * 2,5G. Сколько получается? Правильно, 16+16+8=40G. Я взял размер слова 8 байт, потому, что очевидно, это будет работать на 64-битном эрланге. На 32-х битном будет 20G, но столько памяти там выделить просто нельзя. Если не разделять подсписки, конечно. Ну что, очень страшная проблема, да? Просто "косяк спецификации языка" ((с)Кодт), и "антипаттерн".
Проблема в том, что некоторые товарищи, в число которых в этот раз попал Кодт, разводят истерику на ровном месте, не затрудняя себя при этом элементарной проверкой фактов. И все бы ничего, но посты этих уважаемых людей читают другие люди, и начинают делать выводы, опять же не затрудняя себя проверками, потому что написали такие уважаемые люди как Кодт.
Здравствуйте, Gaperton, Вы писали:
G>Размер списка чисел = размер слова * 2 * количество элементов = 16 * 2,5G. Сколько получается? Правильно, 16+16+8=40G. Я взял размер слова 8 байт, потому, что очевидно, это будет работать на 64-битном эрланге.
tails [1..50]
Люди, я люблю вас! Будьте бдительны!!!
Re[22]: Как замучать эрланговый рантайм
От:
Аноним
Дата:
01.04.08 02:13
Оценка:
Здравствуйте, Gaperton, Вы писали:
G>Проблема в том, что некоторые товарищи, в число которых в этот раз попал Кодт, разводят истерику на ровном месте, не затрудняя себя при этом элементарной проверкой фактов. И все бы ничего, но посты этих уважаемых людей читают другие люди, и начинают делать выводы, опять же не затрудняя себя проверками, потому что написали такие уважаемые люди как Кодт.
Я, как и Кодт, видимо, где-то увидел циферь 50000, и смел поверить, что оно матчится сколько-либо заметно для рантайма. Удивительно, как там вообще смогли выделить, если говорить точно, в общей сложности 74 с половиной гигабайт, перед тем, как дивиться чему-либо. Вот кстати, в тему топика: почему рантайм не убивает процесс, который захотел памяти, сколько ее нет, а рушится сам?
Здравствуйте, http://deadbee.livejournal.com/, Вы писали:
HDL>Я, как и Кодт, видимо, где-то увидел циферь 50000, и смел поверить, что оно матчится сколько-либо заметно для рантайма. Удивительно, как там вообще смогли выделить, если говорить точно, в общей сложности 74 с половиной гигабайт, перед тем, как дивиться чему-либо. Вот кстати, в тему топика: почему рантайм не убивает процесс, который захотел памяти, сколько ее нет, а рушится сам?
Предложите решение которое бы убивало процесс, с сохранением всей семантики и нынешней скорости выполнения.
Здравствуйте, http://deadbee.livejournal.com/, Вы писали:
HDL>Я, как и Кодт, видимо, где-то увидел циферь 50000, и смел поверить, что оно матчится сколько-либо заметно для рантайма. Удивительно, как там вообще смогли выделить, если говорить точно, в общей сложности 74 с половиной гигабайт, перед тем, как дивиться чему-либо.
Смотрим еще раз внимательно.
Там не 50К списков из 50К элементов, а 50К ссылок на один список из 50К элементов
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, http://deadbee.livejournal.com/, Вы писали:
HDL>>Я, как и Кодт, видимо, где-то увидел циферь 50000, и смел поверить, что оно матчится сколько-либо заметно для рантайма. Удивительно, как там вообще смогли выделить, если говорить точно, в общей сложности 74 с половиной гигабайт, перед тем, как дивиться чему-либо. WH>Смотрим еще раз внимательно. WH>Там не 50К списков из 50К элементов, а 50К ссылок на один список из 50К элементов
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Курилка, Вы писали:
К>>А теперь отвечаем: откуда в эрланге ссылки? WH>А что в эрланге объекты передаются по значению?
Здравствуйте, Курилка, Вы писали:
К>А теперь отвечаем: откуда в эрланге ссылки?
Еще можешь покурить вот такую программу:
using System;
using System.Console;
using Nemerle.Utility;
module Program
{
variant Tree
{
| Nil
| Node { l : Tree; r : Tree; }
public Size : int
{
get
{
match (this)
{
| Nil => 1;
| Node(l, r) => 1 + l.Size + r.Size;
}
}
}
}
Main() : void
{
def next(t : Tree) : Tree
{
WriteLine(t.Size);
Tree.Node(t, t);
}
def t : Tree = Tree.Nil();
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
def t = next(t);
_ = ReadKey();
}
}
Таже фигня только в гораздо болие жестоком виде... памяти раз два и обчелся но матчить... особенно если если next раз 100 позвать (ессно подсчет размера придется убрать)
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Курилка, Вы писали:
К>>А теперь отвечаем: откуда в эрланге ссылки? WH>Еще можешь покурить вот такую программу:
[cut]
Здравствуйте, Курилка, Вы писали:
К>>>А теперь отвечаем: откуда в эрланге ссылки? WH>>А что в эрланге объекты передаются по значению?
К>В эрланге нет объектов
Не в пику — мне очень нравятся твои ответы, а исключительно заради справедливости и занудства. Процесс является вполне себе настоящим объектом, со всеми необходимыми аттрибутами объекта. А pid — его identity, ссылкой.
Кроме того, есть (редкие) исключения в виде штуковин типа ets и dets, которые мутабельны, и ничего кроме ссылок на них нет. Соответственно, абстрактные типы данных, которые на построены — например модуль граф из стандартной либы — это самый настоящий объект со ссылками на него, который надо создать и не забыть удалить.
Здравствуйте, Gaperton, Вы писали:
C>>Потому как хуже HiPE уже сложно сделать. G>Обоснуй.
Из опыта. У меня он не ускорил ни одну из моих программ. Даже Питоновский psyco лучшие реузльтаты показывал.
C>>Если серьёзно, то система типов в стандартной библиотеке вместе с достаточно даже примитивным JITом существенно улучшит ситуацию. G>Система типов — это EEP 8. G>http://www.erlang.org/eeps/eep-0008.html
Я знаю. Пока только оно всё ещё не дало видимых результатов.
G>HiPE вообще-то выводит типы из контекста, кстати. А каким именно образом примитивный JIT может улучшить ситуацию — не вполне понятно. Я тебя уже в третий раз подряд об этом спрашиваю. Объяснишь?
Банально — инлайнинг функций, компиляция и инлайнинг ПМ (как в OCaml'е, где ПМ пока самый быстрый из всех, которых я видел). Это две основные вещи, которые могут дать большой прирост скорости.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Gaperton, Вы писали:
G>>HiPE вообще-то выводит типы из контекста, кстати. А каким именно образом примитивный JIT может улучшить ситуацию — не вполне понятно. Я тебя уже в третий раз подряд об этом спрашиваю. Объяснишь? C>Банально — инлайнинг функций, компиляция и инлайнинг ПМ (как в OCaml'е, где ПМ пока самый быстрый из всех, которых я видел). Это две основные вещи, которые могут дать большой прирост скорости.
Банально инлайнинг порушит (или переусложнит) текущую систему модулей и хот апдейт
Здравствуйте, WolfHound, Вы писали:
WH>Смотрим еще раз внимательно. WH>Там не 50К списков из 50К элементов, а 50К ссылок на один список из 50К элементов
Eshell V5.5.2 (abort with ^G)
1> lists:duplicate(5,lists:seq(1,5)).
[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
Значит, при 50K элементах будет список из 50К подсписков, каждый из которых по 50К элементов... всего 2.5G элементов...
Здравствуйте, geniepro, Вы писали:
G>Значит, при 50K элементах будет список из 50К подсписков, каждый из которых по 50К элементов... всего 2.5G элементов...
Еще раз. Там физически ровно 2 списка.
Список интов и список ссылок на список интов.
Ибо никто в здравом уме не станет клонировать неизменяемую структуру данных.
Так что все эти расчеты идут в топку.
Также смотри это
Здравствуйте, Курилка, Вы писали:
C>>Банально — инлайнинг функций, компиляция и инлайнинг ПМ (как в OCaml'е, где ПМ пока самый быстрый из всех, которых я видел). Это две основные вещи, которые могут дать большой прирост скорости. К>Банально инлайнинг порушит (или переусложнит) текущую систему модулей и хот апдейт
Чем? У нас остаётся исходный байт-код. Кто мешает по требованию откатить оптимизации и перейти в режим интерпретации, когда потребуется? Ну это, как Sun JVM сейчас делает.
Sapienti sat!
Re[26]: Как замучать эрланговый рантайм
От:
Аноним
Дата:
02.04.08 01:11
Оценка:
Здравствуйте, WolfHound, Вы писали: G>Значит, при 50K элементах будет список из 50К подсписков, каждый из которых по 50К элементов... всего 2.5G элементов... WH>Еще раз. Там физически ровно 2 списка. WH>Список интов и список ссылок на список интов. WH>Ибо никто в здравом уме не станет клонировать неизменяемую структуру данных. WH>Так что все эти расчеты идут в топку.
В топку идут догадки.
$ erl
Erlang (BEAM) emulator version 5.5.2 [source] [async-threads:0] [kernel-poll:false]
Eshell V5.5.2 (abort with ^G)
1> N=50000, A=lists:duplicate(N,lists:seq(1,N)).
Crash dump was written to: erl_crash.dump
eheap_alloc: Cannot reallocate 2501920024 bytes of memory (of type "heap").
Aborted
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Курилка, Вы писали:
C>>>Банально — инлайнинг функций, компиляция и инлайнинг ПМ (как в OCaml'е, где ПМ пока самый быстрый из всех, которых я видел). Это две основные вещи, которые могут дать большой прирост скорости. К>>Банально инлайнинг порушит (или переусложнит) текущую систему модулей и хот апдейт C>Чем? У нас остаётся исходный байт-код. Кто мешает по требованию откатить оптимизации и перейти в режим интерпретации, когда потребуется? Ну это, как Sun JVM сейчас делает.
Если ты предоставишь реальный юзкейс и реальный механизм где это будет полезно, то можно поговорить.
А так могу заметить ещё факт, что дискретизация параллелизма построена на редукциях и при увеличении тел функций этот параллелизм будет "страдать" (в зависимости от кода, конечно). Плюс не вижу нахрена тут нужен джит, когда этот инлайнинг вполне себе можно делать в HiPE. Или ты предлагаешь держать рантайм статистику вызовов, ещё более "ускоряя" выполнение эрлангового кода, и по ней делать инлайнинг на базе неких эвристик?
Ну нафига нам JVM для эрланга?