Skip to content

Latest commit

 

History

History
236 lines (175 loc) · 6.62 KB

File metadata and controls

236 lines (175 loc) · 6.62 KB

TP - écoconception java

Code a améliorer

float compute(float angle) {
    float alpha = cos(angle) * sin(angle);
    float beta = cos(angle) * tan(angle);
    float gamma = tan(angle) * sin(angle);

    return alpha + beta + gamma;
}

À partir du code donné

  • Quels sont les problèmes ?
  • Comment peut-on améliorer ?

Amélioration : factorisation

Si un même calcul coûteux est fait plusieurs fois, stocker le résultat dans une variable plutôt qu'effectuer le calcul plusieurs fois.

float compute(float angle) {
    float cosAngle = cos(angle);
    float sinAngle = sin(angle);
    float tanAngle = tan(angle);
 
    float alpha = cosAngle * sinAngle;
    float beta = cosAngle * tanAngle;
    float gamma = tanAngle * sinAngle;
 
    return alpha + beta + gamma;
}

Amélioration : cohérence des types

float compute(float angle) {
    float cosAngle = cosf(angle);
    float sinAngle = sinf(angle);
    float tanAngle = tanf(angle);
 
    float alpha = cosAngle * sinAngle;
    float beta = cosAngle * tanAngle;
    float gamma = tanAngle * sinAngle;
 
    return alpha + beta + gamma;
}

Amélioration : valeurs approchées si précision acceptable

En imaginant qu'on dispose de méthodes faisant les calculs approximatifs

  • cos_approx()
  • sin_approx()
  • tan_approx()

Si le résultat ne nécessite pas une grande précision. Il peut être acceptable d'utiliser les méthodes approximatives moins coûteuses

int compute(int angle) {
    int cosAngle = cos_approx(angle);
    int sinAngle = sin_approx(angle);
    int tanAngle = tan_approx(angle);
 
    int alpha = cosAngle * sinAngle;
    int beta = cosAngle * tanAngle;
    int gamma = tanAngle * sinAngle;
 
    return alpha + beta + gamma;
}

Limiter le nombre de librairies importées

Choix des collections

https://www.research-bl.com/green-it-cheat-sheets/

https://github.com/supertanuki/numeriqueEcoResponsable

Complexité O notation

Réduire la compléxité de vos calculs en réduisant la complexité Big O notation

  • Limiter les boucles imbriquées
  • Utiliser les collections appropriées au problème

Mesurer avec Java Flight Recorder

Depuis Intellij

  • lancer un programme en mode Profiler

Attendre un peu

Ouvrir le menu "Profiler"

Recent snapshots

  • ouvrir le rapport "Open Snapshot"

Note : on peut aussi profiler des processus Java en cours d'excution (ex. Scene Builder).

Fichiers .jfr ou .hprof

Cpu time

  • Flame graph
  • Call tree
  • Method list
  • Timeline
  • Events

Flame graph sur CPU time

Quand on a analysé dans le code depuis intelliJ on peut même voir des infos directement dans le code.

CPU time depuis le code

Memory allocations

Allocations mémoire triées par leur propre allocation

img.png

Microbenchmark

 <dependency>
        <groupId>org.openjdk.jmh</groupId>
        <artifactId>jmh-core</artifactId>
        <version>1.37</version>
    </dependency>
    <dependency>
        <groupId>org.openjdk.jmh</groupId>
        <artifactId>jmh-generator-annprocess</artifactId>
        <version>1.37</version>
    </dependency>
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.14.1</version>
    <configuration>
        <source>25</source>
        <target>25</target>
        <!-- Microbenchmark annotation processing -->
        <annotationProcessorPaths>
            <path>
                <groupId>org.openjdk.jmh</groupId>
                <artifactId>jmh-generator-annprocess</artifactId>
                <version>1.37</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>
package tp10.microbenchmark;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import school.coda.java.ecoconception.caching.Caching;

public class BenchmarkRunner {
    public static void main(String[] args) throws Exception {
        org.openjdk.jmh.Main.main(args);
    }


    static final double[] angles = {
            0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9,
            10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19,
            20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29,
            30, 31, 32, 33, 34, 35, 36, 37, 38, 38, 39,
            40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49,
            50, 51, 52, 53, 54, 55, 56, 57, 58, 58, 59,
            60, 61, 62, 63, 64, 65, 66, 67, 68, 68, 69,
            70, 71, 72, 73, 74, 75, 76, 77, 78, 78, 79,
            80, 81, 82, 83, 84, 85, 86, 87, 88, 88, 89,
            90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 99,
            100, 101, 102, 103, 104, 105, 106, 107, 108, 108, 109,
            110, 111, 112, 113, 114, 115, 116, 117, 118, 118, 119,
            120, 121, 122, 123, 124, 125, 126, 127, 128, 128, 129,
            130, 131, 132, 133, 134, 135, 136, 137, 138, 138, 139,
            140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149,
            150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159,
            160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169,
            170, 171, 172, 173, 174, 175, 176, 177, 178, 178, 179,
            180, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189,
            190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199,
            200, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209,
            210, 211, 212, 213, 214, 215, 216, 217, 218, 218, 219,
            220, 221, 222, 223, 224, 225, 226, 227, 228, 228, 229,
            230, 231, 232, 233, 234, 235, 236, 237, 238, 238, 239,
            240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 249,
            250, 251, 252, 253, 254, 255, 256, 257, 258, 258, 259,
            260, 261, 262, 263, 264, 265, 266, 267, 268, 268, 269,
            270, 271, 272, 273, 274, 275, 276, 277, 278, 278, 279,
            280, 281, 282, 283, 284, 285, 286, 287, 288, 288, 289,
            290, 291, 292, 293, 294, 295, 296, 297, 298, 298, 299,
            300, 301, 302, 303, 304, 305, 306, 307, 308, 308, 309,
            310, 311, 312, 313, 314, 315, 316, 317, 318, 318, 319,
            320, 321, 322, 323, 324, 325, 326, 327, 328, 328, 329,
            330, 331, 332, 333, 334, 335, 336, 337, 338, 338, 339,
            340, 341, 342, 343, 344, 345, 346, 347, 348, 348, 349,
            350, 351, 352, 353, 354, 355, 356, 357, 358, 358, 359,
            360,
    };

    @Benchmark
    @BenchmarkMode(Mode.Throughput)
    public void foo() {

        for (double angle : angles) {
            Caching.compute_ad_hoc_double(angle);
        }

    }
}