У меня есть программа на 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
#include
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
Моей целью здесь было не делать ничего истинного тестирования, я просто хотел увидеть, какие различия были в практической ситуации при реализации кода прямым способом.