LINUX.ORG.RU
решено ФорумTalks

Java быстрее С++ помогите восстановить справедливость

 , ,


0

2

Поспорили с коллегой, что быстрее : с++ или java.

Код легкий

int main() { int sum = 0; for (int i = 0; i<10; i++){ for (int ii = 0; ii<0x7fffffff; ii++){ sum=sum + ii; } }

}

Однако в java он выполняется в 5 раз быстрее чем в с++. Помогите с параметрами компиляции, чтобы приблизиться к показателям java

Компилирую #gcc main.c -std=c99

GCC: # gcc -v Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.4.5 (Debian 4.4.5-8)

Перемещено mono из development

Ответ на: комментарий от vertexua

джава может их переупорядочить подряд, так как поймет на что ты намекаешь

Я намекаю на то, что в Java нет value-types (кроме примитивных), поэтому приходится создавать фактически массив из указателей вместо массива значений и это всегда будет медленнее работать.

kamre ★★★
()
Ответ на: комментарий от vertexua

Это все равно не избавляет от лишней косвенности по сравнению с C++/C# вариантами.

kamre ★★★
()

Компиляторы выкидывают коды с пустыми и бессмысленными циклами. Особенно с телами циклов типа i++. А вот «простейший солвер» уравнения Лапласа — сделайте побольше размер поля под ваш объём ОЗУ, должна быть заполнена под завязку (но меньше проходов по сетке). Внимание — это не метод Химено, и не настоящий солвер!

#include <math.h>
#include <stdio.h>

int main()
{
    int N,i,j,k;
    int n=1000;
    N=n+1;
    double U[N][N];
    double side1[N];
    double side2[N];
    for (i=1; i<N; i++)
    {
        side1[i]=i*i-1;
        side2[i]=log(i)-log(n);
    }
    
    for (i=1; i<N; i++)
        for (j=1; j<N; j++)
            U[i][j] = 0.0;

    for (i=1; i<N; i++)
    {
        U[i][n]=U[n][i]=side1[i];
        U[i][1]=U[1][i]=side2[i];
    }

    for (k=1; k<=1000; k++)
        for (i=2; i<=n-1; i++)
            for (j=2; j<=n-1; j++)
                U[i][j]=( U[i-1][j] + U[i+1][j] +
                        U[i][j-1] + U[i][j+1] )/4;
    
    for (i=1; i<6; i++)
    {
        for (j=1; j<6; j++)
            printf("%2.15f ",U[i][j]);
        printf("\n");
    }

}
sanaris
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.