Skip to content

coda-school/java_ecoconception

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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);
        }

    }
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages