Здравствуйте, mik1, Вы писали:
M>Вас не затруднит дать ссылку на аналогичный код на плюсах ? Это чтобы было с чем сравнивать.
LIVE DEMO on Coliru
| Code |
| #include <boost/range/algorithm.hpp>
#include <boost/range/numeric.hpp>
#include <boost/timer/timer.hpp>
#include <iterator>
#include <cstdlib>
#include <vector>
using namespace std;
struct Complex
{
double re = 0., im = 0.;
};
Complex operator+(Complex x, Complex y)
{
return {x.re + y.re, x.im + y.im};
}
Complex operator*(Complex x, Complex y)
{
return {x.re*y.re - x.im*y.im, x.re*y.im + x.im*y.re};
}
Complex random_complex()
{
return {rand() / 1000. - 1000., rand() / 1000. - 1000.};
}
int main()
{
constexpr auto N = 1u << 24;
vector<Complex> v, u;
v.reserve(N);
generate_n(back_inserter(v), N, random_complex);
u = v;
boost::random_shuffle(v);
boost::random_shuffle(u);
{
boost::timer::auto_cpu_timer t;
boost::transform(v, u, v.begin(), [](auto x, auto y) { return x*y; });
}
volatile auto anti_opti = boost::accumulate(v, Complex{});
(void)anti_opti;
}
|
| |
M>Для чистоты экперимента — без нестандартных зависимостей, чтобы мне, не работавшему с плюсами много веков, не так сложно было собирать и запускать этот код
Пока ты редактировал сообщение, я уже сделал в таком виде
Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.
M>Попутно хотелось бы определить, по каким критериям мы сравниваем.
Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.
P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.