Je fouetté ensemble ce quickie, le code de test informel, non scientifique complètement:
import java.util.function.BinaryOperator;
public class Test {
private static void test(String desc, BinaryOperator<Double> op, double a, double b, long startIter)
{
long maxIter = startIter;
long elapsed;
do {
maxIter *= 2;
long start = System.currentTimeMillis();
for (long niter = 0; niter < maxIter; ++niter) {
double res = op.apply(a, b);
}
elapsed = System.currentTimeMillis() - start;
} while (elapsed <= 10_000);
System.out.printf("%-15s/sec\t%g\n",
desc, (maxIter * 1000.0)/elapsed);
}
public static void main(String[] arg)
{
test("Addition (double)", (Double a, Double b) -> {
return a + b;
}, 483902.7743, 42347.775, 10_000_000);
test("Subtraction (double)", (Double a, Double b) -> {
return a - b;
}, 483902.7743, 42347.775, 10_000_000);
test("Multiplication (double)", (Double a, Double b) -> {
return a * b;
}, 483902.7743, 42347.775, 1_000_000);
test("Division (double)", (Double a, Double b) -> {
return a/b;
}, 483902.7743, 42347.775, 1_000_000);
test("Log10", (Double a, Double b) -> {
return Math.log10(a);
}, 483902.7743, 42347.775, 1_000_000);
test("LogE", (Double a, Double b) -> {
return Math.log(a);
}, 483902.7743, 42347.775, 1_000_000);
test("Power", (Double a, Double b) -> {
return Math.pow(a, b);
}, 483902.7743, 12, 100_000);
}
}
Dans mon environnement Java standard --- 8 JDK, Intel Core2 Quad Q8300 @ 2.5GHz --- une sortie brute représentant ce test est la suivante:
Addition (double)/sec 6.18619e+08
Subtraction (double)/sec 4.10651e+08
Multiplication (double)/sec 3.27010e+07
Division (double)/sec 3.22215e+07
Log10 /sec 1.99330e+07
LogE /sec 1.99206e+07
Power /sec 8.67870e+06
Conversion à la performance relative nous avons:
Addition 1.0
Subtraction 1.5
Multiplication 18.9
Division 19.2
Log10 31.0
LogE 31.1
Power 71.3
Comme d'habitude, votre kilométrage peut varier.
Pouvez-vous être plus explicite à propos de votre question? Que signifient ces chiffres? Cela signifie-t-il quelque chose comme "* la division est environ 100 fois plus lente que l'addition *"? Sonorités très plate-forme dépendait si vous me demandez. Cela dépend en grande partie de la façon dont votre code ressemble, du nombre d'optimisations générées par la ** JVM ** et de l'apparence du code machine résultant et de la manière dont il est exécuté par votre processeur. Certainement pas facile de créer des repères significatifs. – Zabuza
Par exemple, notez que de nombreux processeurs utilisent ** des tables de recherche ** pour certaines multiplications fréquentes et d'autres tâches (ils ont les résultats précalculés et stockés dans une table), ils peuvent ainsi retourner une réponse instantanément. Ce champ est tellement plein d'optimisations que vous pouvez difficilement contrôler dans un benchmark. – Zabuza
Juste à titre d'exemple, si vous écrivez 'int sum = 0; pour (int i = 0; i <100; i ++) {sum ++; } ', la ** JVM ** convertira ceci en l'instruction unique' int sum = 100; 'dans le bytecode (fichier * .class *). Il semble alors que l'addition serait extrêmement rapide. Il est si facile de tomber dans de telles suppositions fausses. – Zabuza