macroevolution (
macroevolution) wrote2015-01-11 02:41 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Посоветуйте язык программирования
Я всю жизнь программировал только на бейсике, на разных его версиях. Так получилось. Когда писал кандидатскую, набралось очень много таблиц с данными (это были морфологические признаки морских ежей), и я задолбался обсчитывать их на калькуляторе. Поэтому быстренько освоил бейсик (тогда персональные компьютеры IBM только начали появляться, и к ним прилагался язык GW-Basic). Освоил - и сразу почувствовал себя человеком. С тех пор не переучивался, сейчас пишу все свои программки на VBA в MS Access. То есть в программировании я дилетант, но опытный. Программированием пользуюсь сейчас для имитационного моделирования эволюционных процессов в популяциях. Подумываю об одной новой модели, но понимаю, что на VBA она будет работать невыносимо медленно. Насколько я понимаю, программа, написанная почти на любом другом языке, компилируемом, будет работать в разы быстрее. Вопрос такой: какой из этих языков мне будет быстрее и проще всего освоить? Времени, сил и желания преодолевать трудности и вникать в программистские проблемы - не имеется. Мне бы этот язык просто скачать (можно купить, если не слишком дорого), освоить за пару-тройку дней - и вперед. Т.е. главное, чтобы он был максимально простым в освоении для того, кто знает бейсик, без всяких интеллектуальных "понтов", но работал хотя бы раз в 10 быстрее.
no subject
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 секунд.
no subject
и честные проверки делал на края массива, все 100 000 раз ;-)
все равно 40 раз - очень много, похоже, у меня XL начал свопиться, я же другие приложения не убрал
Надо бы проверить, что даст VB в Visual Studio.
В любом случае, если мы угадали сложность задачи, то выигрыш во времени не окупает изучения неспециалистом нового языка программирования, а проблема скорее всего в обращениях к db
no subject
ну хорошо. ща радн 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];
}
}
Но у меня и комп извините... по сравнению с вашим... мягко говоря... что как бэ тоже надо учитывать.
>> если мы угадали сложность задачи, то выигрыш во времени не окупает изучения неспециалистом нового языка программирования
а если не угадали, то вместо одной ночи расчётов человек будет ждать неделю, например...
no subject
я же не оптимизирую, а в лоб делаю проверки как школьник ;-)
комп - похоже, для этих параметров размер памяти важен, на 8 GB задача ложится в оперативку полностью, а у меня - легла бы, если бы я комп перезагрузил перед запуском XL
> а если не угадали, то вместо одной ночи расчётов человек будет ждать неделю, например...
гадание на кофейной гуще - наше все !
no subject
Начались в деревне танцы!!! :))) ОК! Вот с краевыми
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 ядрами задача будет решаться менее чем за секунду, а на вашем компе, мгновенно. (конечно надо смотреть чё там в функции РАНД и какая энтропия нам нужна. мож и не стоит так морочиться и запилить чёнить простенькое).
В любом случае есть подход экстенсивный (добавить памяти, купить мощнее) а есть интенсивный (мальца мозгом шевельнуть). Я за второе, хотя я вообще не программер, а теплотехник по образованию и всегда работал по профессии.
no subject
Но мы же не ставим задачу оптимизировать, мы хотим воспроизвести примерно, что считает хозяин журнала. Насколько я представляю себе имитационное моделирование, вычислительную сложность итерации мы скорее завысили, а число шагов не бывает очень большим - все существенное выявляется на первых десятках, а дальше начинает накапливаться мусор (если параметры не дискретные, конечно).
Параллельные вычисления - это сугубый оффтопик, хотя ... если автор считает что-то на больших сетках ... почему бы и нет.
RND в бейсиках - псевдослучайный, довольно паршивого качества. Там используется умножение на большое число с остатком, насколько я помню.
no subject
no subject
http://support.microsoft.com/kb/231847
no subject
no subject
это просто линейное преобразование с отбрасыванием старших разрядов, поэтому я и написал "умножение с остатком" ;-)))) типа юмор такой
no subject
no subject
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
чорт, все отступы съело !
no subject
за это я Басик не люблю. бггг)))