Производительность Java Math.tanh ()

У меня есть программа на 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

Моей целью здесь было не делать ничего истинного тестирования, я просто хотел увидеть, какие различия были в практической ситуации при реализации кода прямым способом.

5
задан Peter 3 March 2011 в 12:24
поделиться