Информация об изменениях

Сообщение Re[18]: C# - from indians by indians от 02.06.2015 6:50

Изменено 02.06.2015 6:54 Evgeny.Panasyuk

Здравствуйте, 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(u, Complex{});
    (void)anti_opti;
}


M>Для чистоты экперимента — без нестандартных зависимостей, чтобы мне, не работавшему с плюсами много веков, не так сложно было собирать и запускать этот код


Пока ты редактировал сообщение, я уже сделал в таком виде Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.

M>Попутно хотелось бы определить, по каким критериям мы сравниваем.


Простоту работу со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.

P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.
Здравствуйте, 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.