Kostenvergleichsrechnung beim Serverkauf mit PHP

Im Artikel Stromkosten und Anschaffungskosten beim Serverkauf habe ich eine Formel zum Vergleich der Gesamtkosten von Servern hinsichtlich Strom- und Anschaffungskosten vorgestellt. Jetzt soll das ganze prototypisch in PHP implementiert werden, um eine konkrete Prognose für den einen, oder anderen Server abgeben zu können.

Datenstruktur

Zuerst wird dafür eine Datenstruktur für die beiden zu vergleichenden Server gebraucht. Mit unterschiedlichen kWh-Preisen pro Server, kann dann auch zwischen verschiedenen Standorten verglichen werden.

/* Variablen-Benennung nach Artikel
"Stromkosten und Anschaffungskosten beim Serverkauf" */

$server1=array("Name"=>"Server 1","K"=>180,"I"=>250,"L"=>370,"La"=>0.3,"Bt"=>24,"Pkwh"=>0.19);
$server2=array("Name"=>"Server 2","K"=>419,"I"=>45,"L"=>90,"La"=>0.2,"Bt"=>24,"Pkwh"=>0.19);

Serverkosten berechnen

Jetzt die Funktion, um die jeweiligen Kosten eines einzelnen Servers bei einer bestimmten Laufzeit zu berechnen. Die Funktion entspricht exakt, der aus dem vorherigen Artikel.

/* * Funktion zur Kosten-Berechnen (LCC)
*  PHP Gleitkomma-Arithmetik ist unpraezise. Kleine Abweichungen moeglich.
*
* Eingabe: Assoziatives Array mit Serverwerten, zu berechnende Betriebsdauer
* Ausgabe: LLC-Kosten des Servers bei Betriebsdauer
*/

function serverLLC($server,$days) {
        // Durchschnittlichen Stromverbrauch in Watt pro Stunde berechnen
        $poweravg=($server["I"]*(1-$server["La"])+$server["L"]*$server["La"]);
        $poweravg_kw=$poweravg/1000;
        $llc=$poweravg_kw*$server["Bt"]*$days*$server["Pkwh"]+$server["K"];
        return $llc;
}

Lineare Nullpunktsuche

Durch einsetzen der Werte für den jeweiligen Servers in die Kostenberechnungs-Funktion enstehen zwei unterschiedliche Geradenfunktionen. Um den Schnittpunkt zu berechnen, bietet sich eigentlich ein Computeralgebra-System an, oder zumindest das Regula falsi-Verfahren. So genau muss es hier nicht sein, wir suchen linear den beschränkten Definitionsbereich ab, bis die Differenz der beiden Funktionen null ist.

/* * Funktion zum Schnittpunkt finden, zweier Life Cycle Funktionen
* PHP Gleitkomma-Arithmetik ist unpraezise. Kleine Abweichungen moeglich.
*
* Eingabe: Zwei assoziative Arrays mit Serverwerten, maximale Betriebsdauer
* Ausgabe: Anzahl der Tage, nach denen beide Server die selben LLC-Kosten haben
* Falls kein Schnittpunkt bis max. Betriebsdauer gefunden, Ergebnis 0
*/

function sloppyIntersect($serva,$servb,$maxval) {
        // Lineare Suche, Laufzeit maximal O($maxval)
        for ($i=1; $i < $maxval; $i++) {
                if(floor(serverLLC($serva,$i)-serverLLC($servb,$i)) == 0) {
                        return $i;
                }
        }
        return 0;
}

Prognose abgeben

Um jetzt den günstigeren Server zu bestimmen, macht man sich die Stetigkeit der Geradenfunktionen zu nutze und kann so eine einfache Prognose abgeben.

/* * Funktion um den Zeitpunkt zu bestimmen, 
* ab dem ein Server guenstigere LLC-Kosten hat
*
* Eingabe: Zwei assoziative Arrays mit Serverwerten, maximale Betriebsdauer
* Ausgabe: Zeitpunkt, ab dem Server (und welcher) guenstiger ist
*/

function compareServers($serva,$servb,$maxval) {
        // LLC-Schnittpunkt berechnen
        $intersect=sloppyIntersect($serva,$servb,$maxval);
        // Guenstigeren Server berechnen und ausgeben
        if (serverLLC($serva,$intersect+10) > serverLLC($servb,$intersect+10)) {
                return "Nach ".$intersect." Tagen ist ".$servb["Name"]." guenstiger!";
        } else {
                return "Nach ".$intersect." Tagen ist ".$serva["Name"]." guenstiger!";
        }
}

Ergebnis

Mit den obigen drei Funktionen lässt sich also eine einfache Prognose für die beiden Server erstellen, die von der compareServers()-Funktion abgegeben wird.

Nach 226 Tagen ist Server 2 guenstiger!

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.