Сравнение производительности RethinkDB на NodeJS и Go

Mar 24, 2016 14:35 · 370 words · 2 minute read Go NodeJS Производительность RethinkDB

Выбор платформы для работы RethinkDB

Твёрдо решив что всё таки стоит попробовать использовать RethinkDB в качестве базы данных, я задался какой же платформой воспользоваться для создания REST API.

Раннее я сравнивал RethinkDB c Mysql на различных платформах. Тест был тривиален и содержал лишь в себе инициацию соединения с БД и один запрос на выборку данных.

NodeJS или Go

На графике понятно только одно, что “только не PHP”. Хотя PHP7 весьма неплох.

Теперь пора провести более серьёзный тест на вставку, выборку и удаление данных. За основу я возьму архив изменений валютного курса с kurs.kz

В файле имеются 4114 значений такого вида.

[{
    "id": "2",
    "newdate": "1095206400",
    "usd_buy": "135.4500",
    "usd_sell": "135.9500",
    "eur_buy": "165.2500",
    "eur_sell": "166.8500",
    "rur_buy": "4.6000",
    "rur_sell": "4.6500"
},
... ]

NodeJS

NodeJS множественная вставка (bulk insert)

time curl localhost:3000/insert

real    0m0.811s
user    0m0.004s
sys 0m0.004s

NodeJS выборка

Без обработки результатов

Т.е первый отклик системы после запроса

r.table('archive').run(conn, function(err, res){
  if(err) throw err;
  response.end();
});
time curl localhost:3000/select

real    0m0.077s
user    0m0.008s
sys 0m0.000s

С обработкой результатов (toArray)

r.table('archive').run(conn, function(err, res){
    if(err) throw err;
    res.toArray(function(err, data){
        console.log(err,data.length)
        response.end();
    });
});
time curl localhost:3000/select

real    0m0.201s
user    0m0.004s
sys 0m0.004s

NodeJS массовое удаление

r.table('archive').delete()
time curl localhost:3000/delete

real    0m0.236s
user    0m0.004s
sys 0m0.004s

NodeJS построчное удаление

Здесь уже простым замером времени выполнения запроса не выйдет, так как тут множество асинхронных запросов (4114 шт.). Потому такой “костыль”. (И да я не учитываю время фактического выполнения команды на удаление, лишь сколько занимает “прокрутка” всех данных и запрос на их удаление.)

res.each(function(err, row){
    r.table('archive').get(row.id).delete().run(conn);
}, function(){
    console.log(+new Date()-start); // Завершение  выборки
});
==>  780 ms

Go

Go множественная вставка (bulk insert)

r.DB("test").Table("archive").Insert(archives).Run(session)
[GIN] 2016/03/25 - 11:45:29 | 200 |  482.971048ms | 127.0.0.1 |   GET     /index

Go выборка с приведением к интерфейсам (массиву)

rows, err := r.DB("test").Table("archive").Run(session)
if err != nil { fmt.Println(err)}
var selectedArchives []Archive
errParse := rows.All(&selectedArchives)
if errParse != nil { fmt.Printf("Error scanning database result: %s", errParse) }
fmt.Printf("%d selectedArchives", len(selectedArchives))
[GIN] 2016/03/25 - 11:51:12 | 200 |  210.791357ms | 127.0.0.1 |   GET     /select

Go массовое удаление

r.DB("test").Table("archive").Delete().Run(session)
[GIN] 2016/03/25 - 11:47:22 | 200 |  157.572104ms | 127.0.0.1 |   GET     /delete

Результаты

Они весьма равные. Мне казалось что Go победит с большим отрывом.

P.S

Тесты проводились на машине AMD FX-8320E x 8, 16Gb