「サーチ」Spring bootとノードjs-CPU起動性能比較

10189 ワード

中に入る。


最近node jsを勉強しています.関連検索では「Node jsはNon-Blocking I/O操作に特化しており、CPU操作に弱い」としている.
そこで,Spring BootとNode jsを用いてそれぞれCPU起動アプリケーションとI/O起動アプリケーションを作成し,比較する.
ちなみにNode jsはプログラミング言語なのでNest jsフレームワークを使用します.

Spring bootとNode js:2021年トレンド




Googleのトレンドは、Springbootに比べてNode jsの検索量が大きいことを示しています.Node jsは確かに現在のトレンドです.

Spring boot vs Node js : CPU Bound Application


CPUブートアプリケーションは、CPU密集型アプリケーションです.したがって,以下の論理を実行するサーバを実現する.
1から10000まで、数字に経験値を加算します.
サービスロジックでは、すべてのロジックが実行されます.
Spring boot
CPU Controller
@RestController
public class CpuController {

    @Autowired
    private CpuService cpuService;

    @GetMapping("/")
    public Long cpubound(){
        return cpuService.getNumber();
    }
}
CPU Service
@Service
public class CpuService {
    public Long getNumber(){
        Long number = 0l;
        for(int i = 0; i <= 10000; i++){
            for(int j = 0; j<=i; j++){
                number = number + j;
            }
        }
        return number;
    }
}
Node js(with Nest js)
CPU Controller
@Controller('cpu')
export class CpuController {
  constructor(private readonly cpuService: CpuService) {}

  @Get()
  getNumber(): number{
    return this.cpuService.getNumber();
  }
}
CPU Service
@Injectable()
export class CpuService {
    getNumber() : number{
        var n : number = 0;
        for(var i = 0; i <= 10000; i++){
            for(var j = 0; j<=i; j++){
                n = n + j;
            }
        }
        return n;
    }
}

Artillaryを使用した比較


比較環境は、個別のEC 2サーバに配備するのではなく、ローカル環境で比較されます.
Artillary Scriptは、ローカル環境なので成功するかどうかだけを見ています.
timeoutが設定されているため、CPUの処理性能は成功するかどうかを決定します.
config:
  target: "http://localhost:8080"
  phases:
    - duration: 60
      arrivalRate: 5
  http:
    # Responses have to be sent within 10 seconds, or an `ETIMEDOUT` error gets raised.
    timeout: 100
scenarios:
  - flow:
      - get:
          url: "/"
Spring boot report

Node js

n/a.結論


ローカル環境では、Node jsとSpring bootはそれぞれCPU Boundアプリケーションに戻り、予想とは異なり、Node jsはより良いパフォーマンスを示します.
TimeOutが100秒に設定されているため、Node jsは300個の要求のうち16個を100秒で処理し、Spring bootは100秒で300個の要求のうち1個が処理済みでないと判断することができる.

どうして?(私の原因推論)


->Spring boot(java)リクエストを受信するとスレッドが生成されます.つまり、リクエストごとにスレッドが生成されます!この場合、CPUタスクは処理されないが、要求が増加しつつスレッドが生成されるため、逆に性能が低下すると推測される.
したがって、CPU使用量の高いエンクロージャを単一のリクエストでテストすると、結果が異なる場合があります.
Artillaryでテストするのではなく、Start time-End timeで1~100000を得るのではなく、1~100000,000の数の和でテストすると違います.