macroevolution: (anomalocaris)
macroevolution ([personal profile] macroevolution) wrote2015-01-11 02:41 pm

Посоветуйте язык программирования

Я всю жизнь программировал только на бейсике, на разных его версиях.  Так получилось. Когда писал кандидатскую, набралось очень много таблиц с данными (это были морфологические признаки морских ежей), и я задолбался обсчитывать их на калькуляторе. Поэтому быстренько освоил бейсик (тогда персональные компьютеры IBM только начали появляться, и к ним прилагался язык GW-Basic). Освоил - и сразу почувствовал себя человеком. С тех пор не переучивался, сейчас пишу все свои программки на VBA в MS Access. То есть в программировании я дилетант, но опытный. Программированием пользуюсь сейчас для имитационного моделирования эволюционных процессов в популяциях. Подумываю об одной новой модели, но понимаю, что на VBA она будет работать невыносимо медленно. Насколько я понимаю, программа, написанная почти на любом другом языке, компилируемом, будет работать в разы быстрее. Вопрос такой: какой из этих языков мне будет быстрее и проще всего освоить? Времени, сил и желания преодолевать трудности и вникать в программистские проблемы - не имеется. Мне бы этот язык просто скачать (можно купить, если не слишком дорого), освоить за пару-тройку дней - и вперед. Т.е. главное, чтобы он был максимально простым в освоении для того, кто знает бейсик, без всяких интеллектуальных "понтов", но работал хотя бы раз в 10 быстрее.
romikchef: (Default)

[personal profile] romikchef 2015-01-11 11:30 am (UTC)(link)
Как это часто бывает, большинство комментаторов отвечают не автору вопроса, а себе.
Частично в этом вина автора - ключевую часть вопроса он никак не выделил, а, по моим наблюдениям, многие бросаются отвечать, прочитав лишь заголовок.

Я думаю, что цель надо обязательно вынести в заголовок, "Посоветуйте язык программирования для имитационного моделирования эволюционных процессов в популяциях".
И в первых строках обозначить претензии к текущему языку - медленный.

И принимать только те ответы, которые аргументированно учитывают указанные условия. Очень жаль, кстати, что пока не было ответов от людей, занимающихся подобными вычислениями.

Сам я, увы, не слишком компетентен в предлагаемых языках, но довольно компетентен в программировании вообще. И в этом смысле поддержу единственного комментатора, который попытался сначала выяснить - а что именно является основной причиной медленного исполнения? Такой процесс называется красивым словом "профайлинг" и должен, по-хорошему, предшествовать любым поискам инструмента. Никаких особенных инструментов для этого не требуется - возможно, хватит просто здравого смысла и пары экспериментов.

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

Если же проблема действительно в количестве выполняемых вычислений, то я бы попробовал посоветовать C. Его базовый синтаксис довольно простой и похож на все другие ЯП, а по скорости он является безусловным чемпионом.

Ну, или я бы посмотрел на специализированные системы моделирования, такие, например как продукты http://www.wolfram.com/
Edited 2015-01-11 11:34 (UTC)
kuzh: (Turkmen)

[personal profile] kuzh 2015-01-11 11:41 am (UTC)(link)
Лучший коммент!
От себя добавлю - может сменить компьютер - самое быстрое и дешевое.

И не слушайте про всякие там C# - охота засирать мозги на старости лет?
Edited 2015-01-11 11:42 (UTC)

[identity profile] natvalbr.livejournal.com 2015-01-11 03:50 pm (UTC)(link)
+100500

http://macroevolution.livejournal.com/186606.html?thread=12744174#t12744174

[identity profile] firrior.livejournal.com 2015-01-11 11:52 am (UTC)(link)
Если таблицы с данными, то проще всего оказался... как бы не PHP+MySQL. Автор ведь с вёрсткой дело имел и вывод на веб-страницы его не смутит. А в PHP+MySQL больше всего готовых решений для оптимизации именно SQL-запросов. И красивых графических выводов - бесплатных.

Простите заранее за экзотический подход.
romikchef: (Default)

[personal profile] romikchef 2015-01-11 04:10 pm (UTC)(link)
Ну, уж на что я известный фанат PHP, но такой вариант предлагать не стал :)
Если основная тяжесть ложится на sql, и в этом случае Мysql не является все-таки, лидером по оптимизации. А уж язык, из которого с базой работать - и вовсе вторичен. Ну, и последний гвоздь - именно на богатых вычислениями задачах все тесты показывают РНР в хвосте. Так что, пожалуй, не тот случай.

[identity profile] bear-bull.livejournal.com 2015-01-11 11:56 am (UTC)(link)
""Посоветуйте язык программирования для имитационного моделирования эволюционных процессов в популяциях"."

Будет ноль ответов. Оно вряд ли надо автору.
romikchef: (Default)

[personal profile] romikchef 2015-01-11 04:13 pm (UTC)(link)
И прекрасно.
Если БД по запросу возвращает ноль строк, это не значит, что запрос плохой. А просто нет данных. Отсутствие ответа ясно покажет, что приемлемой альтернативы нет, и стоит оставить привычное окружение.

[identity profile] bear-bull.livejournal.com 2015-01-11 04:39 pm (UTC)(link)
Это как раз не значит, что запрос плохой. Ибо указанная вами задача имеет массу себе подобных с точки зрения языка программирования.

[identity profile] toshick.livejournal.com 2015-01-11 03:22 pm (UTC)(link)
честно говоря, сначала сам написал, потом прочитал Ваш ответ

вот именно
есть у меня нехорошее подозрение, что автор хранит промежуточные данные не в объявленных переменных/массивах/структурах данных (да, на VBA можно делать связные списки и деревья, настоящие), а в таблицах или в полях форм, например
надо сначала разбираться с этим, а то я сомневаюсь, что там такая молотилка, что время на обработку собственно вычислений имеет какое-то значение

[identity profile] lvqcl.livejournal.com 2015-01-11 03:31 pm (UTC)(link)
> а то я сомневаюсь, что там такая молотилка, что время на обработку собственно вычислений имеет какое-то значение

А почему нет? Если популяция большая, и нужно просчитать сотни тысяч поколений... И сделать это сотню раз, чтобы оценить разброс результатов из-за случайностей...

То есть вычисления простые, но их тупо много.

[identity profile] toshick.livejournal.com 2015-01-11 04:51 pm (UTC)(link)
Это пусть автор скажет, но я сомневаюсь.
Ну вот чисто ради смеха, запустил на VBA Excel такую задачу:

1) выделяем массив double(10000, 10000)
2) заполняем его случайными данными от 0 до 1
3) умножаем каждую ячейку на 9 соседних, с честной проверкой на края таблицы

4) крутим 2) и 3) 10 раз, чтобы оценить время на инициализацию массива

результаты (не очень чистые, т.к. я не снимал IE, торрент и прочую хрень):
однократный прогон ~ 83с,
10-кратный прогон ~ 827с.
Итого на инициализацию время почти не тратится, каждая итерация - полторы минуты.
Каждая итерация это, на минуточку, почти миллиард умножений с плавающей точкой на VB + заполнение массива на 100 млн. случайными числами + проверки и логика циклов.

У меня, конечно, не самая слабая машинка, но и не суперкомпьютер: i7 (860, 4 ядра), 2.8GH, 4GB, винты не SSD.

В общем, повторюсь, скорее всего надо просто исключить обращения к базе данных Access из итераций. Если же они там необходимы, то переход на C++ поможет, как мертвому припарки.

[identity profile] guga50.livejournal.com 2015-01-11 07:29 pm (UTC)(link)
>> 10-кратный прогон ~ 827с.

Visual Studio 2013. C++. Оптимизация на скорость О2. Prefer fast code.
Винда 7ка. Проц Intel® Core™2 Quad Processor Q8300 (4M Cache, 2.50 GHz) 8Gb Ram.

18 секунд

http://ic.pics.livejournal.com/guga50/10354015/1544/1544_900.jpg

мля ((((( ну в цикле b должно быть до 10ти... торопился. хрен с ним пусть 20 секунд.
Edited 2015-01-11 19:47 (UTC)

[identity profile] toshick.livejournal.com 2015-01-11 07:47 pm (UTC)(link)
ага, у Вас чуть другое, я крутил и заполнение рандомом 10 раз тоже
и честные проверки делал на края массива, все 100 000 раз ;-)

все равно 40 раз - очень много, похоже, у меня XL начал свопиться, я же другие приложения не убрал
Надо бы проверить, что даст VB в Visual Studio.

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

[identity profile] guga50.livejournal.com 2015-01-11 08:10 pm (UTC)(link)
здрасьте!! а уменя чё проверки понарошные штоль? они просто внутри фор сидят. чё огород городить.
ну хорошо. ща радн 10 раз закручу... но чёта мне подсказывает... :)))

УПД: ОХ! Ёпт! 41 секунда :((

вот такой вариант был:

double **a = new double*[10000];
for (int i = 0; i < 10000; i++)
a[i] = new double[10000];
srand((unsigned)time(NULL));
for (int b = 0; b < 10; b++){
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 10000; j++)
a[i][j] = (double)rand() / RAND_MAX;
for (int i = 1; i < 9999; i++)
for (int j = 1; j < 9999; j++)
{
a[i][j] = a[i - 1][j - 1] *
a[i][j - 1] *
a[i + 1][j - 1] *
a[i - 1][j] *
a[i + 1][j] *
a[i - 1][j + 1] *
a[i][j + 1] *
a[i + 1][j + 1];

}
}

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

>> если мы угадали сложность задачи, то выигрыш во времени не окупает изучения неспециалистом нового языка программирования

а если не угадали, то вместо одной ночи расчётов человек будет ждать неделю, например...
Edited 2015-01-11 20:42 (UTC)

[identity profile] toshick.livejournal.com 2015-01-11 08:45 pm (UTC)(link)
а Вы краевые строчки и столбцы в результате не заполняете ;-)

я же не оптимизирую, а в лоб делаю проверки как школьник ;-)

комп - похоже, для этих параметров размер памяти важен, на 8 GB задача ложится в оперативку полностью, а у меня - легла бы, если бы я комп перезагрузил перед запуском XL

> а если не угадали, то вместо одной ночи расчётов человек будет ждать неделю, например...

гадание на кофейной гуще - наше все !

[identity profile] guga50.livejournal.com 2015-01-12 11:04 am (UTC)(link)
>> а Вы краевые строчки и столбцы в результате не заполняете ;-)
Начались в деревне танцы!!! :))) ОК! Вот с краевыми

double **a = new double*[10002];
for (int i = 0; i < 10001; i++)
a[i] = new double[10002];
srand((unsigned)time(NULL));
for (int b = 0; b < 10; b++){
for (int i = 0 i < 10001; i++)
a[0][i] = 1; a[i][0] = 1; a[10001][i] = 1; a[i][10001] = 1;
for (int i = 1; i < 10001; i++)
for (int j = 1 j < 10001; j++)
a[i][j] = (double)rand() / RAND_MAX;
for (int i = 1; i < 10001; i++)
for (int j = 1; j < 10001; j++)
a[i][j] = a[i - 1][j - 1] * a[i][j - 1] * a[i + 1][j - 1] * a[i - 1][j] *
a[i + 1][j] * a[i - 1][j + 1] * a[i][j + 1] * a[i + 1][j + 1];
}
Просто сделал окантовочку вокруг матрицы из единичек :))
Время если чо не поменялось :-р

>> я же не оптимизирую
я тоже. если по-уму, то для начала обсчёта следующей строки (ну если мы перебираем по горизонтали например) достаточно чтобы предыдущая строка ушла вперёд всего на 2 столбца и можно начинать обсчитывать.
Таким образом программа может распаралеливаться до нескольких тысяч трэдов.
Ну а дальше грузим этой работой ГПУ и получаем результат. Вот тут от железа будет ОЧЕНЬ зависеть. С моей видюхой с пассивным охлаждением и 64 ядрами задача будет решаться менее чем за секунду, а на вашем компе, мгновенно. (конечно надо смотреть чё там в функции РАНД и какая энтропия нам нужна. мож и не стоит так морочиться и запилить чёнить простенькое).

В любом случае есть подход экстенсивный (добавить памяти, купить мощнее) а есть интенсивный (мальца мозгом шевельнуть). Я за второе, хотя я вообще не программер, а теплотехник по образованию и всегда работал по профессии.
Edited 2015-01-12 11:41 (UTC)

[identity profile] toshick.livejournal.com 2015-01-12 12:23 pm (UTC)(link)
Ну да, именно так оно и делается - если речь не идет о сильно разреженной матрице или "жестких" задачах.
Но мы же не ставим задачу оптимизировать, мы хотим воспроизвести примерно, что считает хозяин журнала. Насколько я представляю себе имитационное моделирование, вычислительную сложность итерации мы скорее завысили, а число шагов не бывает очень большим - все существенное выявляется на первых десятках, а дальше начинает накапливаться мусор (если параметры не дискретные, конечно).
Параллельные вычисления - это сугубый оффтопик, хотя ... если автор считает что-то на больших сетках ... почему бы и нет.
RND в бейсиках - псевдослучайный, довольно паршивого качества. Там используется умножение на большое число с остатком, насколько я помню.

[identity profile] guga50.livejournal.com 2015-01-12 12:45 pm (UTC)(link)
деление с остатком

[identity profile] toshick.livejournal.com 2015-01-12 01:39 pm (UTC)(link)
умножение ;-)

http://support.microsoft.com/kb/231847

[identity profile] guga50.livejournal.com 2015-01-12 04:26 pm (UTC)(link)
ну и? чёрным по белому написано "остаток от деления"

(no subject)

[identity profile] toshick.livejournal.com - 2015-01-12 17:10 (UTC) - Expand

(no subject)

[identity profile] guga50.livejournal.com - 2015-01-12 17:21 (UTC) - Expand

[identity profile] toshick.livejournal.com 2015-01-11 07:48 pm (UTC)(link)
Sub qqq()
Dim a(10000, 10000) As Double
Dim i, j, l As Long

Debug.Print "start", Time()

For l = 1 To 10

For i = 1 To 10000
For j = 1 To 10000
a(i, j) = Rnd()
Next j
Next i

For i = 1 To 10000
For j = 1 To 10000
If i <= 1 Then
If j <= 1 Then
a(i, j) = a(i, j)
ElseIf j >= 10000 Then
a(i, j) = a(i, j)
Else
a(i, j) = 1 * a(i, j - 1) * a(i, j) * a(i + 1, j + 1) * a(i + 1, j - 1) * a(i + 1, j) * a(i + 1, j + 1)
End If
ElseIf i <= 10000 Then
If j <= 1 Then
a(i, j) = a(i, j)
ElseIf j >= 10000 Then
a(i, j) = a(i, j)
Else
a(i, j) = a(i - 1, j - 1) * a(i - 1, j) * a(i - 1, j + 1) * a(i, j - 1) * a(i, j) * a(i, j + 1) * 1
End If
Else
If j <= 1 Then
a(i, j) = 1 * a(i - 1, j) * a(i - 1, j + 1) * 1 * a(i, j) * a(i + 1, j + 1) * 1 * a(i + 1, j) * a(i + 1, j + 1)
ElseIf j >= 10000 Then
a(i, j) = a(i - 1, j - 1) * a(i - 1, j) * 1 * a(i, j - 1) * a(i, j) * 1 * a(i + 1, j - 1) * a(i + 1, j) * 1
Else
a(i, j) = a(i - 1, j - 1) * a(i - 1, j) * a(i - 1, j + 1) * a(i, j - 1) * a(i, j) * a(i + 1, j + 1) * a(i + 1, j - 1) * a(i + 1, j) * a(i + 1, j + 1)
End If
End If
Next j
Next i

Next l

Debug.Print "end", Time()

End Sub


чорт, все отступы съело !
Edited 2015-01-11 19:49 (UTC)

[identity profile] guga50.livejournal.com 2015-01-11 08:04 pm (UTC)(link)
ох ебать ))) жёска!
за это я Басик не люблю. бггг)))

[identity profile] natvalbr.livejournal.com 2015-01-11 03:48 pm (UTC)(link)
+1

http://macroevolution.livejournal.com/186606.html?thread=12744174#t12744174
romikchef: (глаза)

[personal profile] romikchef 2015-01-11 04:29 pm (UTC)(link)
Смущает коммент по ссылке
---
basic в названии не должен вводить в заблуждение, потому что purebasic — си-подобный язык, что и написано в статье

[identity profile] aosypov.livejournal.com 2015-01-11 09:49 pm (UTC)(link)
Прекрасный ответ, но.
Сравните скорость _безопасного_ программирования на условном С и условном Перле.
Зачем человеку геморрой в виде всех проблем с памятью, переполнением и т.п.?
Перл + ПДЛ или Питон с НамПи или Р с кондуктором - быстро для освоения, быстро для написания и быстро для исполнения.