Size: a a a

2021 August 18

VB

Vladimir Berezenko in ru.nim.talks
и таки быстрее.
источник

VB

Vladimir Berezenko in ru.nim.talks
источник

VB

Vladimir Berezenko in ru.nim.talks
Ща ещё вариант попробую. Мне интересно будет-ли разница
источник

f

for(int c; (c = getc... in ru.nim.talks
Cxx ops ............................ 7.758 ms      8.208 ms  - среднее  8.208
Nim ops ............................ 7.415 ms      7.844 ms  - среднее 7.844
источник

f

for(int c; (c = getc... in ru.nim.talks
Но в целом я думаю можно выбить из С++ практически нулевой оверхед, вопрос не в этом
источник

VB

Vladimir Berezenko in ru.nim.talks
qmaster$ ./a.out
min: 7.197ms, mean: 7.839ms (607 runs, 1 loops each)
источник

VB

Vladimir Berezenko in ru.nim.talks
с извращённой передачей через указатель, а не по ссылке получается чуть подольше. 7.839
источник

VB

Vladimir Berezenko in ru.nim.talks
в остальном код ровно тот-же что и у тебя
источник

VB

Vladimir Berezenko in ru.nim.talks
C++
#include "test.hpp"
#include <vector>
#include <random>
#include <algorithm>
#include <string>
#include "timeit.hpp"

const int Nb_Instructions = 1000000;
enum {
   OPINC, OPDEC, OPMUL2, OPDIV2, OPADD7, OPNEG
};
std::random_device rd;  //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> distrib(OPINC, OPNEG);

Opc* genOp() {
   switch(distrib(gen)) {
       case OPINC:
           return new OpcInc();
       case OPDEC:
           return new OpcDec();
       case OPMUL2:
           return new OpcMul2();
       case OPDIV2:
           return new OpcDiv2();
       case OPADD7:
           return new OpcAdd7();
       case OPNEG:
           return new OpcNeg();
   };
}

int main(void) {
   std::vector<Opc*> vecOps;
   //vecOps.reserve(Nb_Instructions);
   for(int x = 0; x < Nb_Instructions; ++x) {
       vecOps.push_back(genOp());
   }
   
   timeit([&] {
       int result = 100;
       for(auto op: vecOps) {
           op->eval(&result);
       }}, 607
   );
}
источник

VB

Vladimir Berezenko in ru.nim.talks
Если result передавать в методы через ссылку, а не по указателю - получается ещё быстрее.
источник

VB

Vladimir Berezenko in ru.nim.talks
на 0.2
источник

VB

Vladimir Berezenko in ru.nim.talks
так что nim бэк на С++ пока слабоват.
источник

f

for(int c; (c = getc... in ru.nim.talks
Это к оверхеду диспетчиризации отношения не имеет, хотя было бы неплохо если ним умел генерировать T& функции. Хотя может быть это можно сделать через какой-то хак с importcpp
источник

f

for(int c; (c = getc... in ru.nim.talks
Но в целом 7.839 для С++ vs 7.844 для nim тоже вполне нормальный результат
источник

VB

Vladimir Berezenko in ru.nim.talks
да
источник

VB

Vladimir Berezenko in ru.nim.talks
мне кажется чистую диспетчеризацию можно попробовать проверить вообще не передавая параметр... всё-таки время на упаковку/распаковку тратится.
источник

VB

Vladimir Berezenko in ru.nim.talks
хотя не, пофиг
источник

f

for(int c; (c = getc... in ru.nim.talks
Решил ради интереса добить бенчмарк со всеми возможными вариантами. Пока не до конца все сделал, но получается что методы нима быстрее чем все остальные варианты

name ............................... min time      avg time    std dv   runs
Cxx ops ........................... 10.475 ms     10.691 ms    ±0.211   x465
Nim ops ........................... 10.993 ms     11.212 ms    ±0.222   x444
Nim ops val ....................... 10.571 ms     10.752 ms    ±0.209   x461
Nim manual vtable ................. 10.368 ms     10.573 ms    ±0.213   x471
Nim proc table .................... 10.559 ms     10.761 ms    ±0.189   x462
Nim methods ........................ 9.370 ms      9.606 ms    ±0.267   x515
источник

f

for(int c; (c = getc... in ru.nim.talks
Код здесь я обновил,
источник

f

for(int c; (c = getc... in ru.nim.talks
Но все равно странно, учитывая как там происходит выборка какой метод конкретно вызывать
источник