2017-06-17 6 views
-3

Ich mache einen Benchmark-Test für meinen eigenen Spaß! Ich habe einen Teil des Codes in vielen Programmiersprachen geschrieben und benchmarkiere ihn mit ab, um zu sehen, was schneller und wie viel ist. Ich weiß, dass die Methode möglicherweise nicht so gültig ist und nicht verwendet werden kann, um einige zu verwenden, aber zu meiner eigenen Information tue ich das. Der andere Faktor, den ich wissen möchte, ist, wie einfach/schwierig das gleiche Sample in jeder Sprache geschrieben wird. Ich habe den Code in Python/Python (asyncio), Haskell, Go, Kotlin und D geschrieben. Ich habe den D-Port schneller als Go (oder zumindest gleich schnell) gemacht. Aber leider ist mein D-Code viel langsamer als Go. Hier stelle ich andere Codes und bitte helfen Sie mir, warum der Code nicht wie erwartet schnell ist. Oder irre ich mich absolut in meinen Erwartungen?Warum ist mein D-Code nicht erwartungsgemäß?

import cbor; 
import std.array : appender; 
import std.format; 
import std.json; 
import vibe.vibe; 


struct Location 
{ 
    float latitude; 
    float longitude; 
    float altitude; 
    float bearing; 
} 
RedisClient redis; 


void main() 
{ 
    auto settings = new HTTPServerSettings; 
    redis = connectRedis("localhost", 6379); 

    settings.port = 8080; 
    settings.bindAddresses = ["::1", "127.0.0.1"]; 
    listenHTTP(settings, &hello); 

    logInfo("Please open http://127.0.0.1:8080/ in your browser."); 
    runApplication(); 
} 

void hello(HTTPServerRequest req, HTTPServerResponse res) 
{ 

if (req.path == "/locations") { 

    immutable auto data = req.json; 
    immutable auto loc = deserializeJson!Location(data); 
    auto buffer = appender!(ubyte[])(); 
    encodeCborAggregate!(Flag!"WithFieldName".yes)(buffer, loc); 
    auto db = redis.getDatabase(0); 

    db.set("Vehicle", cast(string) buffer.data); 
    res.writeBody("Ok"); 
    } 
} 

Und hier ist die Go

package main 

import (
    "github.com/kataras/iris" 
    "github.com/kataras/iris/context" 
) 

import "github.com/go-redis/redis" 

import (
    "bytes" 
    "github.com/2tvenom/cbor" 
) 

type Location struct { 
    Latitude float32 `json:"latitude"` 
    Longitude float32 `json:"longitude"` 
    Altitude float32 `json:"altitude"` 
    Bearing float32 `json:"bearing"` 
} 

func main() { 
    app := iris.New() 
    client := redis.NewClient(&redis.Options{Addr: "localhost:6379"}) 

    app.Post("/locations", func(ctx context.Context) { 
     var loc Location 
     ctx.ReadJSON(&loc) 
     var buffTest bytes.Buffer 
     encoder := cbor.NewEncoder(&buffTest) 
     encoder.Marshal(loc) 
     client.Set("vehicle", buffTest.Bytes(), 0) 
     client.Close() 
     ctx.Writef("ok") 
    }) 
    app.Run(iris.Addr(":8080"), iris.WithCharset("UTF-8")) 
} 

ab verwenden, erf etwa 4200 Treffer in/sec, während D etwa 2800 erf/sec!

+1

Ich sehe kein offensichtliches Leistungsproblem, aber es ist schwer zu sagen, weil Ihr Beispielcode nicht kompilierbar ist, also kann ich es nicht profilieren. Gibt es eine Möglichkeit, das in eine http://www.sscce.org/ umzuwandeln? EDIT: vergessen zu sagen, aber bitte auch Informationen darüber, welchen Compiler Sie verwendet haben und in welcher Einstellung, kann dies zu großen Unterschieden führen. – cym13

+0

Ich benutze Standard D anf Go Compiler! Ich meine die neueste Version von Dub und Google Go! Die Anforderungen sind nur 2 Pakete: \t "Abhängigkeiten": { \t "Vibe-d": "~> 0.7.30", "Cbor-d": "~> 0.5.4" \t}, – Kamyar

+1

was die Leistungsergebnisse sind Sie immer und was hast du erwartet? –

Antwort

6

Sie sind nicht nur Go vs D. Benchmarking Sie auch Ihre besondere Auswahl von Nicht-Standard-Go und D Bibliotheken gegeneinander Benchmarking: cbor, vibe, iris, etc. Und Sie Benchmarking Ihre spezielle Implementierung which can easily vary by 1000x in performance.

Mit diesen vielen Variablen sind die Roh-Benchmark-Zahlen ziemlich bedeutungslos für den Vergleich der Leistung von zwei Sprachen. Es ist möglich, dass eine dieser Bibliotheken von Drittanbietern ein Leistungsproblem verursacht. Wirklich, du vergleichst genau diese beiden Programme. Dies ist das Kernproblem, wenn man versucht, alle außer trivialen Programme sprachübergreifend zu vergleichen: Es gibt zu viele Variablen.


Sie können die Auswirkungen einiger dieser Variablen mit performance profiling reduzieren; in Go wäre dies go tool pprof. So erfahren Sie, welche Funktionen und Leitungen wie oft aufgerufen werden und wie viele Ressourcen verbraucht werden. Damit finden Sie Engpässe, Stellen im Code, die sehr viele Ressourcen verbrauchen und konzentrieren sich dort auf die Optimierung.

Während Sie für jede Version Profil- und Optimierungsrunden durchführen, kommen Sie dem Vergleich realer, optimierter Implementierungen näher. Oder Sie werden besser verstehen, was jede Sprache und Bibliothek effizient macht und was nicht.


Das Problem des Sprachenvergleichs wird stark durch das spezielle Problem und den jeweiligen Programmierer beeinflusst. X-Programmierer finden X immer die beste Sprache, nicht weil X die beste Sprache ist, sondern weil X-Programmierer beim Schreiben in X am besten sind und wahrscheinlich ein Problem gewählt haben, mit dem sie vertraut sind. Aus diesem Grund gibt es eine Reihe von Projekten, um die beste Implementierung für jede Sprache zu finden.

Die eine, die sofort in den Sinn kommt, ist The Computer Language Benchmarks Game. Sie gehen, aber nicht D. Vielleicht können Sie es hinzufügen?