Самый быстрый язык для циклов FOR - PullRequest
6 голосов
/ 07 июля 2010

Я пытаюсь найти лучший язык программирования для аналитической модели, которую я строю. Основное внимание уделяется скорости, с которой он будет запускать циклы FOR.

Некоторая деталь:

  • Модель должна выполнять многочисленные (~ 30 на запись, более 12 циклов) операции с набором элементов из массива - в массиве ~ 300 тыс. Строк и ~ 150 столбцов. Большинство из этих операций являются логическими по своему характеру, например, если place (i) = 1, то j (i) = 2.
  • Я построил более раннюю версию этой модели с использованием Octave - для запуска требуется около 55 часов на экземпляре Amazon EC2 m2.xlarge (и он использует ~ 10 ГБ памяти, но я совершенно счастлив бросить больше памяти на это). Octave / Matlab не будет выполнять поэлементные логические операции, поэтому необходимо большое количество циклов for - я относительно уверен, что я максимально векторизовал - оставшиеся циклы необходимы. Я получил многоядерные октавы для работы с этим кодом, что дает некоторое улучшение (снижение скорости ~ 30%, когда я запускаю его на 8 ядрах EC2), но в итоге получается нестабильным с блокировкой файлов и т. Д. + Я действительно ищу пошаговое изменение во время выполнения - я знаю, что на самом деле использование Matlab может принести мне улучшение на 50%, если смотреть на некоторые тесты, но это непомерно дорого. Первоначальный план при запуске программы заключался в том, чтобы фактически запустить Монте-Карло с этим, но при 55-часовом пробеге это совершенно нецелесообразно.
  • Следующая версия этого проекта будет полностью перестроена с нуля (по причинам, связанным с IP, я не буду вдаваться в подробности), поэтому я полностью открыта для любого языка программирования. Я наиболее знаком с Octave / Matlab, но баловался R, C, C ++, Java. Я также опытен с SQL, если решение предполагает хранение данных в базе данных. Я выучу любой язык для этого - это не сложная функциональность, которую мы ищем, не взаимодействие с другими программами и т. Д., Поэтому не слишком озабочен кривой обучения.

Итак, со всем вышесказанным, какой самый быстрый язык программирования специально для циклов FOR? От поиска SO и Google, Fortran и C пузыря к вершине, но ищите еще несколько советов, прежде чем погрузиться в к одному или другому.

Спасибо!

Ответы [ 14 ]

0 голосов
/ 07 июля 2010

APL.

Несмотря на интерпретацию, все его примитивные операторы работают с массивами изначально, поэтому вам редко нужны какие-либо явные циклы.Вы пишете один и тот же код, независимо от того, являются ли данные скалярными или массивными, а интерпретатор позаботится о любом внутреннем цикле, и, следовательно, с минимальными издержками - сами циклы написаны на скомпилированном языке и будут сильно оптимизированы для конкретныхархитектура процессора, на котором он работает.

Вот пример простоты обработки массива в APL:

    A <- 2 3 4 5 6 8 10
    ((2|A)/A) <- 0
    A
2 0 4 0 6 8 10

В первой строке A задается вектор чисел.Вторая строка заменяет все нечетные числа в векторе нулями.Третья строка запрашивает новые значения A, а четвертая строка - результирующий вывод.

Обратите внимание, что явного зацикливания не требовалось, так как скалярные операторы, такие как '|'(остаток) автоматически распространяется на массивы по мере необходимости.APL также имеет встроенные примитивы для поиска и сортировки, которые, вероятно, будут быстрее, чем написание собственных циклов для этих операций.

В Википедии есть хорошая статья по APL , которая также предоставляет ссылкипоставщикам, таким как IBM и Dyalog.

0 голосов
/ 07 июля 2010

как насчет ленивого языка загрузки, такого как clojure. это шутка, так как в большинстве диалектов шурупов отсутствует цикл for, но есть много других форм, которые работают более идиоматически для обработки списка. Это также может помочь при масштабировании, поскольку операции являются поточно-ориентированными, а язык функционален и имеет меньше побочных эффектов. Если вы хотите найти в списке все элементы со значениями 'i', вы можете сделать что-то вроде этого.

(def mylist ["i" "j" "i" "i" "j" "i"])
(map #(= "i" %) mylist)

результат

(true false true true false true)

0 голосов
/ 07 июля 2010

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

Это и оптимизированный алгоритм должны помочь (и, возможно, реструктурировать данные?).

Вы также можете попробовать несколько алгоритмов ипрофиль их.

0 голосов
/ 07 июля 2010

Как хранятся данные?Ваше время выполнения, вероятно, больше зависит от ввода-вывода (особенно диска или, что еще хуже, сети), чем от вашего языка.

Предполагая, что операции со строками ортогональны, я бы использовал C # и использовал PLINQ , чтобы использовать весь параллелизм, который мог.

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