成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Spring Boot和Rust生成二維碼的性能比較(附代碼)

開發(fā)
本文重點(diǎn)比較使用虛擬線程的SpringBoot和使用Actix框架的Rust,來實(shí)現(xiàn)QR碼生成器API。

本文重點(diǎn)比較使用虛擬線程的SpringBoot和使用Actix框架的Rust,來實(shí)現(xiàn)QR碼生成器API。這兩種技術(shù)都是成熟的,無需進(jìn)一步介紹。接下來,讓我們直接深入測試設(shè)置的細(xì)節(jié)。

一、測試設(shè)置

1. 環(huán)境

所有測試都在裝有16GB RAM的MacBook Pro M1上進(jìn)行。使用的測試工具是Bombardier的定制版本,支持在請求體中包含隨機(jī)URL。這些測試使用的軟件版本如下:

  • SpringBoot 3.1.3,帶有Java v20(啟用預(yù)覽以獲取虛擬線程)
  • Rust 1.72.0

2. 代碼

這個(gè)QR碼生成器應(yīng)用程序被設(shè)計(jì)成接收一個(gè)JSON請求體,其中包含一個(gè)名為"urlToEmbed"的必需參數(shù)。該應(yīng)用程序的主要功能是為指定的URL生成一個(gè)QR碼,并在HTTP響應(yīng)中以PNG格式傳送QR碼。為增加復(fù)雜性,該應(yīng)用程序在HTTPS上運(yùn)行。

(1) SpringBoot(虛擬線程)

server.port=3000
server.ssl.certificate=/Users/mayankc/Work/source/certs/cert.pem
server.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;

@SpringBootApplication
public 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;

@RestController
public 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) Rust

[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
}


// 注意 ================================================
// 該應(yīng)用程序已在發(fā)布模式下構(gòu)建。
// =====================================================

二、結(jié)果

為了全面評估性能,這里進(jìn)行了一系列細(xì)致的檢查。每個(gè)檢查包括10萬個(gè)請求,并在10、50和100個(gè)并發(fā)連接的范圍內(nèi)評估它們的效率。考慮到QR碼生成的資源密集型特性,故意保持了稍低的請求量,與其他場景相比。

結(jié)果如下:

根據(jù)以下公式,還生成了一個(gè)得分卡。對于每個(gè)測量,獲取獲勝的差距。如果獲勝的差距是:

  • < 5%,不給予任何分?jǐn)?shù)
  • 在5%到20%之間,獲勝者得1分
  • 在20%到50%之間,獲勝者得2分
  • 50%,獲勝者得3分

得分卡如下:

責(zé)任編輯:趙寧寧 來源: Java學(xué)研大本營
相關(guān)推薦

2024-06-26 08:46:45

2023-11-17 09:07:51

.NET生成二維碼識(shí)別二維碼

2023-11-17 15:44:06

C++庫生成二維碼

2013-10-29 09:46:05

二維碼

2013-03-27 16:13:17

Android開發(fā)Android二維碼生QR生成

2015-09-24 09:56:19

.NET二維碼

2013-01-30 12:16:49

二維碼NFC近場通訊

2023-10-31 08:16:16

Go語言二維碼

2014-12-31 15:37:16

二維碼生成掃描

2020-12-30 10:55:01

代碼Java二維碼

2017-11-21 09:00:15

PHP二維碼LOGO圖像

2021-02-08 08:40:00

Zint二維碼開源

2011-12-30 17:09:41

二維碼APP靈動(dòng)快拍

2015-11-09 13:03:47

JavaServlet創(chuàng)建二維碼

2015-01-14 09:46:52

Google API

2020-08-07 14:18:03

二維碼Go語言編程

2011-12-06 16:40:45

二維碼快拍二維碼靈動(dòng)快拍

2012-04-01 09:53:13

二維碼

2017-02-21 09:17:46

二維碼漏洞

2011-11-24 16:00:23

信息圖QR碼二維碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久专区 | 亚洲综合在线网 | 欧美日韩国产中文 | 天天干狠狠干 | 成年人免费在线视频 | 天天天堂 | 日韩欧美精品一区 | 成人伊人网 | 久久久久久久久久久国产 | 国产精品国产a级 | 欧美不卡一区二区 | 日本精品一区二区三区在线观看视频 | 欧美午夜精品理论片a级按摩 | 在线免费观看黄色网址 | 亚洲一区| 伊人免费在线观看高清 | 黄a在线播放 | 久久69精品久久久久久久电影好 | 日韩一区二区在线看 | 麻豆视频国产在线观看 | 波多野结衣二区 | 狠狠狠色丁香婷婷综合久久五月 | 欧美一级毛片在线播放 | 久久亚洲春色中文字幕久久久 | 日韩免费视频 | 国产精品视频一区二区三区 | 日韩免费视频 | 一级全黄视频 | 在线视频一区二区三区 | 性视频一区 | 亚洲成人精品在线观看 | 欧洲国产精品视频 | 国产成人99久久亚洲综合精品 | 国产综合精品一区二区三区 | 亚洲精品女人久久久 | 在线精品国产 | 羞羞的视频在线 | 91成人在线 | 国产中文区二幕区2012 | 欧美在线网站 | 精品日韩在线观看 |