脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Go vs Rust:文件上传性能比较

Go vs Rust:文件上传性能比较

2023-11-20 16:55技术的游戏 Golang

在本文中,主要测试并比较了Go—Gin和Rust—Actix之间的多部分文件上传性能。

在本文中,主要测试并比较了Go—Gin和Rust—Actix之间的多部分文件上传性能。

Go vs Rust:文件上传性能比较

一、设置

所有测试都在配备16G内存的 MacBook Pro M1 上执行。

软件版本为:

  • Go v1.20.5
  • Rust v1.70.0

测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请求。

资产目录中有 100,000 个文件。每个文件的大小都是确切的 100K。这些文件数量在测试工作线程之间进行分配。同一个文件不会一遍又一遍地上传。工作线程会循环处理分配给它们的文件。一旦它们处理完所有分配的文件,它们就会回到第一个文件重新开始。

每个请求携带两个文件作为多部分请求体。请求的头部和体部大致如下:

// -- Headers

{
  "content-length": "205150",
  "content-type": "multipart/form-data; boundary=------------------------3f6a15690b315b91",
}

// -- Body

--------------------------3f6a15690b315b91
Content-Disposition: form-data; name="files"; filename="45469"
Content-Type: application/octet-stream

<>
--------------------------3f6a15690b315b91
Content-Disposition: form-data; name="files"; filename="42102"
Content-Type: application/octet-stream

<>
--------------------------3f6a15690b315b91--

二、代码

1.Go

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/jaevor/go-nanoid"
)

func main() {
    dst := "/Users/mayankc/Work/source/perfComparisons/uploads/"
    canonicID, err := nanoid.Standard(21)
    if err != nil {
        panic(err)
    }

    router := gin.New()
    router.POST("/upload", func(c *gin.Context) {
        form, _ := c.MultipartForm()
        files := form.File["files"]

        for _, file := range files {
            c.SaveUploadedFile(file, dst+canonicID())
        }
        c.Writer.WriteHeader(201)
    })
    router.Run(":3000")
}

2.Rust

use actix_multipart::{
    form::{
        tempfile::{TempFile, TempFileConfig},
        MultipartForm,
    }
};
use actix_web::{middleware, web, App, Error, HttpResponse, HttpServer, Responder};
use nanoid::nanoid;

const BASE_DIR: &str = "/Users/mayankc/Work/source/perfComparisons/uploads/";

#[derive(Debug, MultipartForm)]
struct UploadForm {
    #[multipart(rename = "files")]
    files: Vec,
}

async fn save_files(
    MultipartForm(form): MultipartForm,
) -> Result {
    for f in form.files {
        let path = format!("{}{}", BASE_DIR, nanoid!());
        f.file.persist(path).unwrap();
    }

    Ok(HttpResponse::Ok())
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .wrap(middleware::Logger::default())
            .app_data(TempFileConfig::default().directory(BASE_DIR))
            .service(
                web::resource("/upload")
                    .route(web::post().to(save_files)),
            )
    })
    .bind(("127.0.0.1", 3000))?
    .run()
    .await
}

Rust代码已在release mode下编译。

三、结果

对10个、50个和100个并发连接执行测试。每个测试总共执行10万个请求。以下是结果:

Go vs Rust:文件上传性能比较

Go vs Rust:文件上传性能比较

四、结论

从结果中使用以下公式生成了一个评分表。对于每个测量,获取获胜的幅度。如果获胜幅度为:

  • < 5%,不给予任何分数
  • 在 5% 和 20% 之间,给予获胜者 1 分
  • 在 20% 和 50% 之间,给予获胜者 2 分
  • > 50%,给予获胜者 3 分

Go vs Rust:文件上传性能比较

Go vs Rust:文件上传性能比较

原文地址:https://mp.weixin.qq.com/s?__biz=MzUzMTY1MDAwMQ==&mid=2247486544&idx=1&sn=3dff3aa8678964381533e72f65853e4a

延伸 · 阅读

精彩推荐
  • Golanggolang中json的omitempty使用操作

    golang中json的omitempty使用操作

    这篇文章主要介绍了golang中json的omitempty使用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    wilsonyx13442021-03-23
  • Golang试了下Golang实现try catch的方法

    试了下Golang实现try catch的方法

    虽然在使用Golang的时候发现没有try catch这种错误处理机制但是想一想golang作为一门优雅的语言,似乎也是情理之中。那么够怎么捕获异常呢,本文就来介绍...

    锐玩道8732021-08-12
  • GolangGO语言延迟函数defer用法分析

    GO语言延迟函数defer用法分析

    这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的...

    shichen20144192020-04-11
  • Golanggo micro集成链路跟踪的方法和中间件原理解析

    go micro集成链路跟踪的方法和中间件原理解析

    这篇文章主要介绍了go-micro集成链路跟踪的方法和中间件原理,关于Http或者说是Restful服务的链路跟踪,go-micro的httpClient支持CallWrapper,可以用WrapCall来添加链...

    波斯马11582022-09-30
  • GolangGolang并发操作中常见的读写锁详析

    Golang并发操作中常见的读写锁详析

    Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段,这篇文章主要给大家介绍了关于Golang并发操作中...

    ReganYue11562021-09-17
  • GolangGo错误和异常CGO fallthrough处理教程详解

    Go错误和异常CGO fallthrough处理教程详解

    这篇文章主要为大家介绍了Go错误和异常CGO fallthrough使用教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    王中阳Go4472022-11-12
  • GolangGo语言基础函数基本用法及示例详解

    Go语言基础函数基本用法及示例详解

    这篇文章主要为大家介绍了Go语言基础函数基本用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪...

    枫少文8882021-12-06
  • GolangGolang 语言 For 和 For-range 的区别

    Golang 语言 For 和 For-range 的区别

    在 Golang 语言中,仅有 for 一种循环语句,但是可以模拟 while (condition) {} 和 while (true) {}。除此之外,Golang 语言还引入了另外一个关键字 range,我们也可以配...

    Golang语言开发栈4922021-12-28