Почему в этом простом примере теста BubbleSort Java оказывается быстрее, чем C++?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему в этом простом примере теста BubbleSort Java оказывается быстрее, чем C++?

Сообщение Anonymous »

От коллег я слышал, что C++ быстрее, чем Java, и если вам нужна максимальная производительность, особенно для финансовых приложений, это лучший путь. Но мои наблюдения немного отличаются. Может ли кто-нибудь указать на неудачи моего эксперимента или добавить к обсуждению некоторые научные переменные?
Примечание 1: Я использую -O3 ( максимальная оптимизация) и -O2 с компилятором C++.
Примечание 2: Краткое и простое полное включены исходные коды для каждого языка. Не стесняйтесь запускать на своем компьютере, вносить изменения, делать выводы и делиться ими.
Примечание 3. Если вы поместите оба исходных кода рядом в редакторе, вы увидите, что их реализации эквивалентны.
ОБНОВЛЕНИЕ: Я пробовал clang++ и g++ с различными вариантами оптимизации (-O2, -O3, -Os, -march=native и т. д.), и все они дают более медленные результаты, чем Java. Я думаю, что на этом этапе, чтобы ускорить C++, мне нужно погрузиться в сгенерированный ассемблерный код и заняться программированием на ассемблере. Мне интересно, насколько практичен этот подход (программирование на ассемблере и отладка на ассемблере) при кодировании большого реального приложения.
Что делает тест?< /p>
  • Создать массив int в куче (не в стеке)
  • Запустить часы
  • Заполнить массив
  • Сортировать массив с пузырьковой сортировкой
  • Остановите часы
Сделайте это 10 миллионов раз, отбросьте первый 1 миллион для разминки и выведите среднее, минимальное и максимальное время.
Для C++ я получаю: (с -O3 и -O2)
$ g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

$ g++ TimeBubbleSort.cpp -o TimeBubbleSort -std=c++11 -O3
$ ./TimeBubbleSort 10000000 1000000 60
Value computed: 18300000000
Iterations: 9000000 | Avg Time: 1202 | Min Time: 1158 | Max Time: 212189

$ g++ TimeBubbleSort.cpp -o TimeBubbleSort -std=c++11 -O2
$ ./TimeBubbleSort 10000000 1000000 60
Value computed: 18300000000
Iterations: 9000000 | Avg Time: 1337 | Min Time: 1307 | Max Time: 36650

Для Java я получаю:
$ java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)

$ javac -cp . TimeBubbleSort.java
$ java -cp . TimeBubbleSort 10000000 1000000 60
Value computed: 18300000000
Iterations: 9000000 | Avg Time: 837.0 | Min Time: 812 | Max Time: 37196

Полный код C++:
#include
#include
#include

using namespace std;

// TO COMPILE: g++ TimeBubbleSort.cpp -o TimeBubbleSort -std=c++11 -O3
// TO EXECUTE: ./TimeBubbleSort 10000000 1000000 60

long get_nano_ts(timespec* ts) {
clock_gettime(CLOCK_MONOTONIC, ts);
return ts->tv_sec * 1000000000 + ts->tv_nsec;
}

struct mi {
long value;
};

void swapping(int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}

void bubbleSort(int *array, int size) {
for(int i = 0; i < size; i++) {
bool swaps = false;
for(int j = 0; j < size - i - 1; j++) {
if(array[j] > array[j+1]) {
swapping(array[j], array[j+1]);
swaps = true;
}
}
if (!swaps) break;
}
}

void doSomething(int *array, int size) {

for(int z = 0; z < size; z++) {
array[z] = size - z;
}

bubbleSort(array, size);
}

int main(int argc, char* argv[]) {

int iterations = stoi(argv[1]);
int warmup = stoi(argv[2]);
int arraySize = stoi(argv[3]);

struct timespec ts;

long long x = 0;
long long totalTime = 0;
int minTime = numeric_limits::max();
int maxTime = numeric_limits::min();

int * array = (int*) malloc(arraySize * sizeof(int));

for(int i = 0; i < iterations; i++) {

long start = get_nano_ts(&ts);

doSomething(array, arraySize);

long end = get_nano_ts(&ts);

for(int j = 0; j < arraySize; j++) {
x += array[j];
}

int res = end - start;

if (res = warmup) {
totalTime += res;
minTime = min(minTime, res);
maxTime = max(maxTime, res);
}
}

int count = iterations - warmup;

double avg = totalTime / count;

cout

Подробнее здесь: https://stackoverflow.com/questions/727 ... chmark-exa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»