Сравнение скорости работы nodejs, php, python, lua, luajit, наполнение массива



А захотелось мне протестировать, на сколько отличается скорость работы этих языков программирования. В их чистом виде, по самой простейшей задаче. Для этого создал новую, чистую виртуалку, и установил lua 5.3.3, luajit 2.0.4, nodejs 8.6, python 3.5 и php7.0.

Всё, кроме ноды, ставил из стандартных репозиториев. Ставил так, как ставило бы 99% людей, без излюбонов со сборкой из сорцов.

Тест

Просто много раз пересоздаём массив и добавляем в него овер 9999 элементов. Исходники:

php

$start = microtime(true);

for($raund=0; $raund<1000; $raund++) {
  $arr = [];
  for($aLength=0; $aLength<1000000; $aLength++) {
    $arr[] = 1;
  }
}

$timeSpent = microtime(true) - $start;
echo "Time spent: " . $timeSpent . "\n";

python

import time

start = time.time()

for raund in range(0, 1000):
  myList = []
  for aLength in range(0, 1000000):
    myList.append(1)

timeSpent = time.time() - start
print("Time spent: ", timeSpent)  

nodejs

let start = new Date();

for(let raund=0; raund<1000; raund++) {
  let arr = [];
  for(let aLength=0; aLength<1000000; aLength++) {
    arr.push(1);
  }
}

let end = new Date();
let timeSpent = end - start;
console.log('Time spent:', timeSpent);

lua

local tstart = os.time() 

for raund=1,1000 do
  arr = {}
  for aLength=1,1000000 do
    table.insert(arr, 1)
  end
end

local timeSpent = os.time() - tstart
print("Time spent: " .. timeSpent .. "\n");

Update

Господин Анон, в комментах предложил лучший код для луа:

local tstart = os.time()

for raund=1,1000 do
  local arr = {}
  local i = 0
  for aLength=1,1000000 do
    i = i + 1
    arr[i] = 1
  end
end

local timeSpent = os.time() - tstart
print("Time spent: " .. timeSpent .. "\n");

Результаты

Время выполнения скрипта, в секундах.

nodejs 8.6.0 php 7.0 luajit 2.0.4 python 3.5 lua 5.3.3
24.621 55.76 84 10 125.2 181 33

В итоге, nodejs наголову разбил всех. php как ни странно на втором месте, про python промолчим. А вот lua стал неожиданно тормозным, даже jit компиляция ему не помогает.

Update

С новым тестом для луа, уже не всё так однозначно, нода отстаёт только от luajit, а с простолуа результат почти одинаковый.


Сообщество: AWS

Комментариев(8)


ID: #495   Создан:
Автор: anon

А если таки корректный код на Lua затестить?

for raund=1,1000 do local arr = {} local i = 0 for aLength=1,1000000 do i = i + 1 arr[ i ] = 1 end end

ID: #496   Создан:
Автор: ololoev
>>495

Спасибо, анон, так работает значительно быстрее. Инфу обновил.

ID: #497   Создан:
Автор: Igr

Python myList = [1] * 1000000

ID: #498   Создан:
Автор: anon
>>497

local myList = setmetatable({}, {__index = function () return 1 end})

ID: #499   Создан:
Автор: ololoev
>>497

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

ID: #500   Создан:
Автор: lgr
>>499

это понятно, вопрос в преалокации. сделайте [None]*1000000 и заполняйте чем хотите. тоже самое и на C++ vector оптимизация. Я это к тому - что вы меняете производительность менеджера памяти вместо рандом генератора для абстрактного случая hello world, которым в продакшене не особо пользуются. Про питоновский list вроде даже в документации написано про не самую лучшую производительность как плату за универсальность.

ID: #501   Создан:
Автор: lgr
>>499

это как бы вопрос к синтетике - в предложенном вами случае победил определенный вариант имплементации

ID: #502   Создан:
Автор: ololoev
>>501

Это да, синтетика- она ещё та синтетика. Но всё же, да, я так и хотел посмотреть как каждый язык справится с этой задачей, без предварительной оптимизации разработчиками.

Всего: 8 комментариев на 1 страницах

Ваш комментарий будет анонимным. Чтобы оставить не анонимный комментарий, пожалуйста, зарегистрируйтесь



Сообщества