LINUX.ORG.RU

C++ уступает java


0

0

Код #include <stdio.h> #include <conio.h> #include <windows.h> class A { public: double calculate(double p1, double p2) { return (p1 / p2)/(p1+p2); } }; int main() { printf("start...\n"); long t1 = GetTickCount(); double res = 0; for(int i = 0; i < 10000000; i++) { A *a = new A(); res += (a->calculate(i+1, 11)); delete a; } long t2 = GetTickCount() - t1; printf("res = %f, time = %i \n", res, t2); getch(); return 0; }

медленнее чем

public class NewClass { public NewClass() { } public static void main(String[] args) { System.out.println("start..."); double res = 0; long t1 = System.currentTimeMillis(); for(int i = 0; i < 10000000; i++) { res += (new A().calculate(i + 1, 11)); } long t2 = System.currentTimeMillis() - t1; System.out.println("res = " + res + " time = " + t2); } } class A { public double calculate(double p1, double p2) { return (p1 / p2)/(p1+p2); }

anonymous

Это дохлая попытка раздуть флэйм о том, что аллокатор памяти Java в некоторых случаях работает эффективно?

tailgunner ★★★★★
()

Дурачек, твой код ничего не говорит о том, что C++ медленне Java. Ты хоть подумал о том, что сделал. Конечно, 10 миллионов раз выделить память и _освободить_ ее в C++, и просто выделять ее в Java. Конечно временные издержки на освобождение памяти 10 миллионов раз скажутся. А вот в реальном проекте, когда Java начнет подчищать за тобой, вот тогда ты поймешь, как Java быстра.

P. S. Ты хоть бы запостил второй раз с нормальным форматированием, думаешь кто-то захочет читать твой код?

// satanic-mechanic

anonymous
()
Ответ на: комментарий от scotinomys

public class NewClass {
    
    /** Creates a new instance of NewClass */
    public NewClass() {
    }
    public static void main(String[] args) {
        System.out.println("start...");
        double res = 0;
        Random rand = new Random();
        long t1 = System.currentTimeMillis();
    for(int i = 0; i < 10000000; i++) {
        res += (new A().calculate(i + 1, rand.nextFloat() * 100 ));
    }
        long t2 = System.currentTimeMillis() - t1;
        System.out.println("res = " + res + " time = " + t2);
    }
}
class A {
    public double calculate(double p1, double p2) {
        return (p1 / p2)/(p1+p2);
    }
}





#include <stdio.h>
#include <conio.h>
#include <windows.h>
class A {
public:
    double calculate(double p1, double p2) {
        return (p1 / p2)/(p1+p2);
    }
};
int main() {
    printf("start...\n");
    long t1 = GetTickCount();
    double res = 0;
    for(int i = 0; i < 10000000; i++) {
        A *a = new A();
        res +=  a->calculate(i+1, ((double) rand()/ (double) RAND_MAX) * 100);
        delete a;
    }
    long t2 = GetTickCount() - t1;
    printf("res = %f, time = %i \n", res, t2);
    getch();
    return 0;
}

anonymous
()
Ответ на: комментарий от anonymous

Как всё сложно.
Давай проще!

int
main(void)
{
    for(;;);
    return 0;
}

и

class A {
    public static void main(String args []) {
        System.out.println("I'm dumn fast, baby!");
    }
}

Компилируем, запускаем, сравниваем время выполнения.
Делаем вывод: Java рулит!

execve
()
Ответ на: комментарий от anonymous

А если серьёзно, то
1). как уже сказали выше, в Java память только выделяется, в C++ за то же самое время и выделяется, и освобождается.
2). rand() в Java и C++ реализованы совершенно по разному и выполняются за разное время.

В сумме это называется НЕКОРРЕКТНЫЙ ТЕСТ.

execve
()

>C++ уступает java >медленнее чем

Ну да. GC если памяти навалом быстрее чем malloc/free

В том смысле, что при стратегии вроде: выделяем пока не заполнится почти вся память, затем, когда лимит исчерпан, находим реально используемые блоки, выделяем под них еще немного памяти и копируем на новое место, а затем за O(1) помечаем всю ранее использовавшуюся память как свободную.

Совсем другое дело, когда свободной памяти не очень много, тогда что бы выделить пару байт предется обходить всю кучу, и делать это придется часто. И все будет жутко медленно. А если придется лазить в своп, то будет ну очень медленно.

Отсюда вывод для того чтобы жаба не тормозила необходимо и (возможно достаточно) много памяти. Вопрос: а какой сложности может быть программа, что бы malloc/free уступал java скажем на 4GB памяти?

ival ★★
()

не надо себя утешать этими тестами :) Жава - это тормоз.. Я тоже себя утешал такими вещами, пока не протёр глазки на то что Жава быстрее только криво написанного когда на Си...

forgiven
()
Ответ на: комментарий от tailgunner

>Это дохлая попытка раздуть флэйм о том, что аллокатор памяти Java в некоторых случаях работает эффективно?

Вот, для флейма: http://balancer.ru/forum/punbb/viewtopic.php?id=32510

У меня на одной из машин чистый вычислительно/вызывательный код (пресловутый Фибоначи) работал на Java быстрее, чем на Си :)

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