Здравствуйте, VladD2, Вы писали:
VD>Дык выигрыша в продуктивности (программистов) я и так добьюсь во многих областях (особенно в бизнес-софте) взяв вместо С++ тот же C#. С++ язык довольно сложный и низкоуровенвый...
С# высокоуровневый в одном аспекте. Но реально получается что при написании алгоритмов приходится париться о низкоуровневых вещах, не связаных с задачей. Если приходится портить алгоритмы ради оптимизации это не достаточно высокий уровень. Я не выгораживаю ФЯ, просто хочу сказать что проблемы не решенные есть, которые можно было бы решить при желании.
Например на C#: Есть у нас некоторый алгоритм со сложными вычислениями, выдает множество данных. Дальше еще 2 алгоритма данные обрабатывают. Хороший прием изоляции алгоритмов это векторизовать — один алгоритм считает и выдает ArrayList, другие два по очереди пробегаются по нему делают свое дело, затем этот ArrayList выбрасывается за ненадобностью.
Вот при этом начнет голова пухнуть когда будешь думать об оптимизации.
1) Можно промежуточные данные в ArrayList не сохранять, тогда все в одном месте считать — и все будет жутко криво.
2) Если же его использовать то получишь боксинг на численных типах, и затраты памяти на большом количестве данных (не известно хватит ли памяти вобще).
3) Сделать функцию вычисления произвольного элемента данных (виртуальный ArrayList). Получим жуткие тормоза при произвольном доступе — если природа итеративна и есть стартап код перед итерациями.
4) Сделать callback через делегат в цикле вычисления, либо итератор. Тогда прийдется писать специальный итератор который вперед забегает и буферизует 3 рассчитаных значения если понадобится кроме текущего элемента иметь доступ к предыдущему и следующему (не пересчитывать же одно и тоже по 3 раза). И при втором проходе прийдется снова все заново пересчитывать. А вот хочется мне в несколько проходов использовать — алгоритм упростится.
И какое отношение имеют к решаемой задаче эти вопросы. Никакого. И где тут высокий уровень?
Этим должен оптимизатор заниматься. Вобще то синтаксису ИЯ такая оптимизация не противоречит.
Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.