У меня есть Java-программа, которая выполняет много вызовов функции Math.tanh ().Из любопытства я хотел сделать сравнение с C ++.Поэтому я написал две небольшие программы, одну на Java и одну на C ++, для тестирования.
Код Java:
public class TestTanh {
public static void main(String[] args) {
double t1 = -1.0;
double t2 = 1.0;
double step = 1e-8;
double z = 0.0;
for(double t=t1; t<=t2; t += step) {
double y = Math.tanh(t);
z += y;
}
System.out.println("Sum = " + z);
}
}
и код C ++:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double t1 = -1.0;
double t2 = 1.0;
double step = 1e-8;
double z = 0.0;
for(double t=t1; t<=t2; t += step) {
double y = tanh(t);
z += y;
}
cout << "Sum = " << z << "\n";
}
Компиляция и запуск программ Я получил следующее:
$ time java TestTanh
Sum = -0.41281032759865655
real 0m18.372s
user 0m17.961s
sys 0m0.109s
и
$ time ./test_tanh
Sum = -0.41281
real 0m4.022s
user 0m3.641s
sys 0m0.004s
Почему для выполнения Java-программы требуется примерно в 5 раз больше времени?Может ли это быть связано с тем, что JIT сначала выполняет компиляцию?Или реализация tanh в Java медленнее, чем в C ++?
Это простой тест, который может иметь тривиальное объяснение, но я искал в Интернете и не нашел ответа.Моя версия Java
$ java -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)
При использовании функции tanh в более крупной программе, содержащей другие основные арифметические операции, разница между Java и C ++ стала меньше (теперь около 2,3).Программа все еще вызывает tanh несколько раз, но теперь в цикле есть и другие операции.Я также попробовал класс FastMath
из Apache Commons , но он был на самом деле медленнее (нужны какие-то особые настройки?).Результат для этой программы с идентичными параметрами:
C ++
real 0m18.031s
user 0m18.007s
sys 0m0.007s
Java с lang.Math
real 0m40.739s
user 0m40.032s
sys 0m0.088s
Java с org.apache.commons.math.util.FastMath
real 0m46.717s
user 0m46.583s
sys 0m0.372s
Моя цель здесь не состояла в том, чтобы провести какой-либо настоящий бенчмаркинг, я просто хотел посмотреть, какие различия были в практической ситуации при простой реализации кода.