当前位置:首页 > 科技  > 软件

使用Spring Boot和Rust生成二维码的性能比较(附代码)

来源: 责编: 时间:2023-09-25 10:39:12 455观看
导读本文重点比较使用虚拟线程的SpringBoot和使用Actix框架的Rust,来实现QR码生成器API。这两种技术都是成熟的,无需进一步介绍。接下来,让我们直接深入测试设置的细节。一、测试设置1. 环境所有测试都在装有16GB RAM的MacBo

本文重点比较使用虚拟线程的SpringBoot和使用Actix框架的Rust,来实现QR码生成器API。这两种技术都是成熟的,无需进一步介绍。接下来,让我们直接深入测试设置的细节。FJu28资讯网——每日最新资讯28at.com

FJu28资讯网——每日最新资讯28at.com

一、测试设置

1. 环境

所有测试都在装有16GB RAM的MacBook Pro M1上进行。使用的测试工具是Bombardier的定制版本,支持在请求体中包含随机URL。这些测试使用的软件版本如下:FJu28资讯网——每日最新资讯28at.com

  • SpringBoot 3.1.3,带有Java v20(启用预览以获取虚拟线程)
  • Rust 1.72.0

2. 代码

这个QR码生成器应用程序被设计成接收一个JSON请求体,其中包含一个名为"urlToEmbed"的必需参数。该应用程序的主要功能是为指定的URL生成一个QR码,并在HTTP响应中以PNG格式传送QR码。为增加复杂性,该应用程序在HTTPS上运行。FJu28资讯网——每日最新资讯28at.com

(1) SpringBoot(虚拟线程)FJu28资讯网——每日最新资讯28at.com

server.port=3000server.ssl.certificate=/Users/mayankc/Work/source/certs/cert.pemserver.ssl.certificate-private-key=/Users/mayankc/Work/source/certs/key.pem
package com.example.qr;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;import org.springframework.context.annotation.Bean;import java.util.concurrent.Executors;@SpringBootApplicationpublic class QrApplication {  public static void main(String[] args) {    SpringApplication.run(QrApplication.class, args);  }  @Bean  public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {    return protocolHandler -> {      protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());    };  }}
package com.example.qr;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.http.ResponseEntity;import org.springframework.http.HttpStatus;import org.springframework.http.HttpHeaders;import org.springframework.web.bind.annotation.RestController;import java.util.Optional;import com.example.qr.QrRequest;import com.example.qr.QrGenerator;@RestControllerpublic class QrController {  @PostMapping("/qr")  public ResponseEntity handleRequest(@RequestBody QrRequest qrRequest) {    if(qrRequest.getUrlToEmbed() == null) {      return new ResponseEntity<>(HttpStatus.BAD_REQUEST);    }    try {      HttpHeaders httpHeaders = new HttpHeaders();      httpHeaders.add(HttpHeaders.CONTENT_TYPE, "image/png");      return new ResponseEntity<byte[]>(         QrGenerator.generateQR(qrRequest.getUrlToEmbed(), 512, 512),          httpHeaders,         HttpStatus.OK);    } catch (Exception e) {      return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);    }  }}
package com.example.qr;import java.io.ByteArrayOutputStream;import java.io.IOException;import com.google.zxing.BarcodeFormat;import com.google.zxing.WriterException;import com.google.zxing.client.j2se.MatrixToImageConfig;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.QRCodeWriter;public class QrGenerator {  public static byte[] generateQR(String text, int width, int height) throws WriterException, IOException {    QRCodeWriter qrCodeWriter = new QRCodeWriter();    BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);    ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();    MatrixToImageConfig con = new MatrixToImageConfig() ;    MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream, con);    byte[] pngData = pngOutputStream.toByteArray();    return pngData;  }}
package com.example.qr;public class QrRequest {  private String urlToEmbed;  public String getUrlToEmbed() {    return this.urlToEmbed;  }  public void setUrlToEmbed(String urlToEmbed) {    this.urlToEmbed = urlToEmbed;  }}

(2) RustFJu28资讯网——每日最新资讯28at.com

[package]name = "actix_qr_generator"version = "0.1.0"edition = "2021"[dependencies]actix-web = { version = "4", features = ["openssl"] } qrcode-generator = "4.1.8"serde = { version = "1.0", features = ["derive"] }serde_json = "1"openssl = { version = "0.10" , features = ["vendored"] }
use actix_web::{web, post, App, HttpServer, HttpResponse, Responder};use qrcode_generator::QrCodeEcc;use serde::Deserialize;use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};#[derive(Deserialize)]struct QrRequest {  urlToEmbed: String,}#[post("/qr")]async fn generate_qr(qr_request: web::Json<QrRequest>) -> impl Responder {  if qr_request.urlToEmbed.is_empty() {    return HttpResponse::BadRequest().into();  }  let result: Vec<u8> = qrcode_generator::to_png_to_vec(qr_request.urlToEmbed.clone(), QrCodeEcc::Low, 512)    .unwrap();  return HttpResponse::Ok()    .content_type("image/png")    .body(result);}#[actix_web::main]async fn main() -> std::io::Result<()> {  let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();  builder    .set_private_key_file("/Users/mayankc/Work/source/perfComparisons/certs/key.pem", SslFiletype::PEM)    .unwrap();  builder    .set_certificate_chain_file("/Users/mayankc/Work/source/perfComparisons/certs/cert.pem")    .unwrap();  HttpServer::new(|| App::new().service(generate_qr))    .bind_openssl("127.0.0.1:3000", builder)?    .run()    .await}// 注意 ================================================// 该应用程序已在发布模式下构建。// =====================================================

二、结果

为了全面评估性能,这里进行了一系列细致的检查。每个检查包括10万个请求,并在10、50和100个并发连接的范围内评估它们的效率。考虑到QR码生成的资源密集型特性,故意保持了稍低的请求量,与其他场景相比。FJu28资讯网——每日最新资讯28at.com

结果如下:FJu28资讯网——每日最新资讯28at.com

FJu28资讯网——每日最新资讯28at.com

FJu28资讯网——每日最新资讯28at.com

FJu28资讯网——每日最新资讯28at.com

根据以下公式,还生成了一个得分卡。对于每个测量,获取获胜的差距。如果获胜的差距是:FJu28资讯网——每日最新资讯28at.com

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

FJu28资讯网——每日最新资讯28at.com

得分卡如下:FJu28资讯网——每日最新资讯28at.com

FJu28资讯网——每日最新资讯28at.com

FJu28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11260-0.html使用Spring Boot和Rust生成二维码的性能比较(附代码)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 基于Python + SnowNLP实现一个文本情感分析系统网站

下一篇: C++11中auto关键字的深入理解与应用

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
Top