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!
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
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
was die Leistungsergebnisse sind Sie immer und was hast du erwartet? –