调试一个计算密集型的小玩意儿,本机计算挺久的,感觉还是需要更多cpu,正在想要不要用批量计算,读文档的时候发现启动也并不是很方便,数据准备到COS/CFS上,然后启动运行,再去COS/CFS上捞结果,这样用云函数来做岂不是更轻松?而且云函数就可以并发几十几百个实例,如果用来做计算性能怎么样呢?干脆做了个一个benchmark。这里用crypto的大质数生成算法来测试计算能力。
代码语言:javascript复制'use strict';
const {Worker}=require('worker_threads')
const threads = 1;
let counter=0;
let arr=[]
let workerScript = `import {parentPort} from 'worker_threads';
import crypto from 'crypto';
let counter=0;
parentPort.onmessage = async (event) => {
const cmd = event.data;
if(cmd=="start"){
while(true){
await new Promise((res,rej)=>{
crypto.createDiffieHellman(512).getPrime();
counter
setImmediate(res);
})
}
}else if(cmd=="stop"){
parentPort.postMessage(counter)
}
}`
let url = new URL("data:text/javascript;charset=UTF-8," encodeURIComponent(workerScript));
for(let i=0;i<threads;i ){
let worker = new Worker(url)
worker.on('message', value => {
counter =value
worker.res();
worker.terminate()
});
arr.push(worker)
}
exports.main_handler = (event, context,callback) => {
Promise.all(arr.map(worker=>{
let p = new Promise((res,rej)=>{
worker.res = res;
})
worker.postMessage("start");
return p;
})).then(()=>{
console.log("threads: " threads " score: " (counter/10) " avg: " (counter/threads/10))
callback(null,"threads: " threads " score: " (counter/10) " avg: " (counter/threads/10))
})
setTimeout(()=>{
arr.forEach(worker=>worker.postMessage("stop"))
},20000)
return event
};
require('os').cpus().length在一些环境下会拿到0,因此这里干脆hardcode了线程数,每次按照具体的环境改一下代码也不麻烦。在多核场景下运行的时候可以修改threads常量来增加并发线程数。在一台8核16G上测试到的数值作为100分。
代码语言:javascript复制threads: 8 score: 104 avg: 13
在4核的macbook上测试的时候成绩也差不多。
代码语言:javascript复制threads: 6 score: 106.5 avg: 17.75
在手机(Mate40pro)上测的就比较惊喜了
能顶大半台服务器或者笔记本了,看来以后可以把一些计算交给手机。
回到云函数。在腾讯云64M的SCF实例上测得10分左右,这就超出期望了,十个这样的微小实例岂不是就可以打得过一台8核服务器?不过增加内存的时候分配到的cpu并没有成比例增加。因此任务拆给更多的小实例计算可能可以蹭到更多的计算资源。
同时也测试了一下阿里云FC的最低配0.05核128M
结果也类似,用最小实例能蹭到最多的计算资源。