Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么我的D代码的性能不如预期?_Go_D - Fatal编程技术网

Go 为什么我的D代码的性能不如预期?

Go 为什么我的D代码的性能不如预期?,go,d,Go,D,我正在做一个基准测试,为我自己的乐趣!我已经用许多编程语言编写了一部分代码,并使用ab对其进行了基准测试,以查看哪个更快,速度有多快。我知道这种方法可能不那么有效,也不能作为一种明显的使用方法,但为了我自己的信息,我正在这样做。我想知道的另一个因素是,用每种语言编写相同的样本有多容易/难。我用Python/Pythonasyncio、Haskell、Go、Kotlin和D编写了代码。我将D端口扩展为比Go更快,或者至少速度相等。但不幸的是,我的D代码比Go慢得多。在这里,我把其他代码,请帮助我为

我正在做一个基准测试,为我自己的乐趣!我已经用许多编程语言编写了一部分代码,并使用ab对其进行了基准测试,以查看哪个更快,速度有多快。我知道这种方法可能不那么有效,也不能作为一种明显的使用方法,但为了我自己的信息,我正在这样做。我想知道的另一个因素是,用每种语言编写相同的样本有多容易/难。我用Python/Pythonasyncio、Haskell、Go、Kotlin和D编写了代码。我将D端口扩展为比Go更快,或者至少速度相等。但不幸的是,我的D代码比Go慢得多。在这里,我把其他代码,请帮助我为什么代码不是预期的快。还是我的期望完全错了

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"); 
    }
}
现在开始

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,Go的结果约为4200请求/秒,而D的结果约为2800请求/秒

您不仅仅是对Go和D进行基准测试。您还对特定的非标准Go和D库(cbor、vibe、iris等)进行基准测试,并对特定的实现进行基准测试

有了这么多变量,原始基准数据对于比较两种语言的性能来说是毫无意义的。这些第三方库中的任何一个都可能导致性能问题。实际上,你只是在比较这两个特定的程序。这是试图在不同语言之间比较除琐碎程序以外的任何程序的核心问题:变量太多了

您可以通过以下方式减少其中一些变量的影响:;在围棋中,这将是围棋的工具。这将告诉您哪些函数和行被调用了多少次,占用了多少资源。有了它,您可以发现瓶颈、代码中消耗大量资源的地方,并将优化工作集中在这些地方

当您为每个版本进行配置文件和优化轮次时,您将更接近于比较真实的、优化的实现。或者您将更好地了解每种语言和库有效地做了什么,以及它们没有做什么

比较语言的问题很大程度上受到特定问题和特定程序员的影响。X程序员总是发现X是最好的语言,不是因为X是最好的语言,而是因为X程序员在用X编写代码时是最好的,并且可能选择了一个他们感到舒服的问题。因此,有许多项目可以为每种语言提供最佳的实现


我马上想到的是。它们确实可以,但不是D。也许您可以添加它?

我没有看到任何明显的性能问题,但很难说,因为您的示例代码不可编译,所以我无法分析它。有没有办法把它变成一个?编辑:忘了说,但请包括您使用的编译器和设置的信息,这可能会导致巨大的差异。我使用默认的D和Go编译器!我是说最新版本的dub和Google Go!需求只有两个包:依赖项:{vibe-d:~>0.7.30,cbor-d:~>0.5.4},您得到了什么性能结果?您期望得到什么?您尝试过评测吗?@Kamyar这只是您编写的代码。每个库函数调用调用的代码越多,调用的代码越多,调用的代码越多。。。而且代码的数量与性能几乎没有关系。一个人可以用很少的行编写非常慢的代码。