Skip to content

[Hackaton 2024][Rhodium-Antimoine][PHP] EC2 - AvoidMultipleIfElseStatement #113

Description

@Chmaqo

Associated rule title

AvoidMultipleIfElseStatement : do not use multiple if, else if, else statements

Associated rule link
https://github.com/green-code-initiative/ecoCode/blob/main/ecocode-rules-specifications/src/main/rules/EC2/php/EC2.asciidoc

Language and platform

Language PHP
Platform : Lenovo T570
CPU : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz (x86_64)
RAM : 2133 MHz - 8GB

Measure justification

Using VJoule and 100000 runs on two samples (a good one and a bad one), here are the results :

Processing rule EC2 - language php
----------------------
RUNNING vjoule
TESTING good CASE

time    70ms673µs
PDU     0.00 J
CPU     0.46 J
RAM     0.04 J
GPU     0.00 J
----------------------
RUNNING vjoule
TESTING bad CASE


time    111ms312µs
PDU     0.00 J
CPU     0.79 J
RAM     0.05 J
GPU     0.00 J
----------------------

Validation

The measurement performed validates.

The percentage of certainty of this validation 95%, it is simple to reproduce using samples such as these ones :

/* GOOD PHP CASE */

<?php

function main() {
    $i = 15;
    $res = 0;
    switch ($i) {
        case 0:
            $res = 1;
            break;
        case 1:
            $res = 2;
            break;
        case 2:
            $res = 3;
            break;
        case 3:
            $res = 4;
            break;
        case 4:
            $res = 5;
            break;
        case 5:
            $res = 6;
            break;
        case 6:
            $res = 7;
            break;
        case 7:
            $res = 8;
            break;
        case 8:
            $res = 9;
            break;
        case 9:
            $res = 10;
            break;
        case 10:
            $res = 11;
            break;
        case 11:
            $res = 12;
            break;
        case 12:
            $res = 13;
            break;
        case 13:
            $res = 14;
            break;
        case 14:
            $res = 15;
            break;
        case 15:
            $res = 16;
            break;
    }
    return $res;
}

for ($i = 1; $i <= 1000000; $i++) {
    main();
}

?>
/* BAD PHP CASE */

<?php

function main() {
    $i = 15;
    $res = 0;

    if ($i == 0) {
        $res = 1;
    } elseif ($i == 1) {
        $res = 2;
    } elseif ($i == 2) {
        $res = 3;
    } elseif ($i == 3) {
        $res = 4;
    } elseif ($i == 4) {
        $res = 5;
    } elseif ($i == 5) {
        $res = 6;
    } elseif ($i == 6) {
        $res = 7;
    } elseif ($i == 7) {
        $res = 8;
    } elseif ($i == 8) {
        $res = 9;
    } elseif ($i == 9) {
        $res = 10;
    } elseif ($i == 10) {
        $res = 11;
    } elseif ($i == 11) {
        $res = 12;
    } elseif ($i == 12) {
        $res = 13;
    } elseif ($i == 13) {
        $res = 14;
    } elseif ($i == 14) {
        $res = 15;
    } elseif ($i == 15) {
        $res = 16;
    } else {
        $res = 17;
    }
    return $res;
}

for ($i = 1; $i <= 1000000; $i++) {
    main();
}

?>

Metadata

Metadata

Assignees

Labels

🗃️ rulerule improvment or rule development or bug

Type

Fields

No fields configured for Task.

Projects

Status
Ready

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions