Добрый вечер!
Читал пост о том, как код на ассемблере работает быстрее си.
thedeemon.livejournal.com/49226.html
Там суть такова, что есть два
int массива на 256 элементов:
Задачка очень простая: есть два массива 16-битных целых чисел, найти сумму квадратов разностей. В оригинале это были блоки 16х16, и проходить их надо было в двойном цикле.... Цикл такой прогоняю 10 млн раз и смотрю время, а также смотрю, что за код сгенерировался.
И мне стало интересно, сколько этот процесс займет на C и на Python.
Я накидал такой код на C:
int main(int argc, char **argv)
{
int g = 0;
int a_list[] = {256 рандомных чисел от 1 до 100};
int b_list[] = {256 рандомных чисел от 1 до 100};
for (g = 0; g < 1000000; g++)
array_func(a_list, b_list);
return 0;
}
void array_func(int arr1[], int arr2[])
{
int sum = 0, j=0;
int x = 0, y = 0;
for (y = 0; y < 16; y++)
{
for (x = 0; x < 16; x++)
{
short v = arr1[j] - arr2[j];
sum += v*v;
j++;
}
}
}
Такой же код у меня был на Питоне:
def main_func(a_list, b_list):
summ = 0 #инициализация суммы
j = 0 #независимый счетчик от 0 до 256
for y in range(0, 16):
for x in range(0, 16):
p = a_list[j] - b_list[j]
summ += p * p
j += 1
for g in range(0, 1000000):
main_func(a_list, b_list)
Замерял время выполнения с помощью линуксовой команды
time.
И выяснил следующие удивительные для меня вещи:
- Второй python отрабатывает миллион итераций быстрее третьего: 40 с против 52-55 с
- Perl (на нем я писал, правда, методом тыка) отрабатывает тот же миллион за две с половиной минуты
- Си отрабатывает десять миллионов за 11 с
- Если переписать всё в одну функцию (соответственно, три вложенных цикла) - python и си выполняются на пару мс быстрее, а Perl - на минуту быстрее(!?)
Я программировать только начинаю учиться, и у меня несколько вопросов:
- Почему третий питон работает в этом случае медленнее второго?
- Почему Perl работает так медленно и ведет себя так странно?
- И самое главное - почему этот же код на JavaScript в мозилле срабатывает за 6,8 секунд?? Как он оказался быстрее скомпилированного C ?
P.S. Код на JavaScript:
function main_func(a_list, b_list) {
for (var g = 0; g < 10000000; g++) {
var summ = 0;
var j = 0;
for (var y = 0; y < 16; y++) {
for (var x = 0; x < 16; x++) {
var p = a_list[j] - b_list[j];
summ += p * p;
j++;
}
}
}
}
console.time('test');
main_func(a_list, b_list);
console.timeEnd('test');