计算性能在计算密集型的服务上,是非常重要的, 一直以为,在计算性能上,肯定是C++  > go > nodejs >= python

但测试结果却让人大跌眼镜!!!

实际的结果是:

go > nodejs > c++ > python

各语言同样逻辑下的运行结果,如下:

其中, ./t是go编译的程序, ./a.out是c++编译的程序, nodejs和python直接跑脚本

不用关注target size的内容,这个是验证结果一致的,保证算法是一致

主要看use time, 单位是秒:

这个结果很奇妙,反映出在计算密集的场景下,C++并非想象中那么快,而nodejs表现却非常亮眼

难道是我的代码问题?各位看官看看有没办办法优化性能的?

相关的编译器、执行器版本如下:

go: 1.15.2

g++:  4.8.2

nodejs: 14.18.0

python:3.7.3

各语言的测试代码如下, 计算逻辑是完全一致的:

Go:

package main;

import "fmt"
import "time" type Data struct {
x float64
y float64
a int
} func MakeData(num int) []Data {
var vec = make([]Data, 0, num)
for i:=0; i< num; i++ {
var data Data
data.x = float64(i) + 0.5;
data.y = float64(i) + 1.5;
data.a = i;
vec = append(vec, data)
}
return vec
} func Cal(data []Data, idx int, num int) float64 {
var sum1 float64 = 0.0;
var sum2 float64 = 0.0;
for i:= idx-num+1; i <= idx; i++ {
if i <0 {
continue;
}
var elem = data[i];
sum1 += elem.x;
sum2 += elem.y;
} var avg1 = sum1/float64(num);
var avg2 = sum2/float64(num); return (avg1 + avg2)/2;
} func Make(data []Data) {
var target = make([]float64, 0, len(data));
for i := 0; i < len(data); i++ {
var v = Cal(data, i, 1000);
if v > 1000 {
target = append(target, v)
}
}
fmt.Println("target size:" , len(target))
} func main() {
var t1 = time.Now().UnixNano()
var data = MakeData(300*365*5);
Make(data);
var t2 = time.Now().UnixNano()
fmt.Println("use time:", float64(t2-t1)/1000000000)
}

C++:

#include <stdio.h>
#include <iostream>
#include <vector>
#include <utility>
#include <string>
#include <unistd.h>
#include <sys/time.h> struct Data {
double x;
double y;
int a;
}; std::vector<Data> MakeData(int num) {
std::vector<Data> vec;
vec.reserve(num);
for (int i=0; i< num; i++) {
Data data;
data.x = static_cast<double>(i) + 0.5;
data.y = static_cast<double>(i) + 1.5;
data.a = i;
vec.push_back(std::move(data));
}
return std::move(vec);
} double Cal(std::vector<Data> & data, int idx, int num) {
double sum1 = 0.0;
double sum2 = 0.0;
for (int i = idx-num+1; i <= idx; i++) {
if (i <0) {
continue;
}
auto & elem = data[i];
sum1 += elem.x;
sum2 += elem.y;
} auto avg1 =sum1/num;
auto avg2 =sum2/num; return (avg1 + avg2)/2;
} void Make(std::vector<Data> & data) {
std::vector<double> target;
target.reserve(data.size());
for (int i = 0; i < data.size(); i++) {
auto v = Cal(data, i, 1000);
if (v > 1000) {
target.push_back(v);
}
}
std::cout << "target size:" << target.size() << std::endl;
} int main(int argc,char** argv)
{
struct timeval t1;
struct timeval t2;
gettimeofday(&t1, NULL);
auto data = MakeData(300*365*5);
Make(data);
gettimeofday(&t2, NULL);
auto usetime = double((t2.tv_sec*1000000 + t2.tv_usec) - (t1.tv_sec*1000000 + t1.tv_usec))/1000000;
std::cout <<"use time: " << usetime << std::endl;
}

NodeJs:

class Data {
constructor() {
this.x = 0.0;
this.y = 0.0;
this.a = 0;
}
}; function MakeData(num) {
let vec = [];
for (let i=0; i< num; i++) {
let data = new Data();
data.x = i + 0.5;
data.y = i + 1.5;
data.a = i;
vec.push(data);
}
return vec;
} function Cal(data, idx, num) {
let sum1 = 0.0;
let sum2 = 0.0;
for (let i = idx-num+1; i <= idx; i++) {
if (i <0) {
continue;
}
let elem = data[i];
sum1 += elem.x;
sum2 += elem.y;
} let avg1 =sum1/num;
let avg2 =sum2/num; return (avg1 + avg2)/2;
} function Make(data) {
let target = [];
for (let i = 0; i < data.length; i++) {
let v = Cal(data, i, 1000);
if (v > 1000) {
target.push(v);
}
}
console.log("target size:", target.length);
} t1 = new Date().getTime();
let data = MakeData(300*365*5);
Make(data);
t2= new Date().getTime();
console.log("use time:", (t2-t1)/1000)

Python:

import time

class Data:
def __init__(self):
self.x = 0.0
self.y = 0.0
self.a = 0 def MakeData(num):
vec = []
for i in range(0, num):
data = Data()
data.x = i + 0.5
data.y = i + 1.5
data.a = i
vec.append(data)
return vec def Cal(data, idx, num):
sum1 = 0.0
sum2 = 0.0
i = idx-num+1
while i<=idx:
if i <0:
i+=1
continue
elem = data[i]
sum1 += elem.x
sum2 += elem.y
i+=1 avg1 =sum1/num
avg2 =sum2/num return (avg1 + avg2)/2 def Make(data):
target = []
data_len = len(data)
for i in range(0, data_len):
v = Cal(data, i, 1000)
if v > 1000:
target.append(v)
print("target size:" , len(target)) t1=time.time()
data = MakeData(300*365*5)
Make(data)
print("use time:", time.time() - t1)

关于c++、go、nodejs、python的计算性能测试,结果令人惊讶的更多相关文章

  1. [转载] NodeJS无所不能:细数十个令人惊讶的NodeJS开源项目

    转载自http://www.searchsoa.com.cn/showcontent_79099.htm 在几年的时间里,Node.JS逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量 ...

  2. windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等

    安装matplotlib: pip install matplotlib 背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器 ...

  3. Python TF-IDF计算100份文档关键词权重

    上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF- ...

  4. Python科学计算(二)windows下开发环境搭建(当用pip安装出现Unable to find vcvarsall.bat)

    用于科学计算Python语言真的是amazing! 方法一:直接安装集成好的软件 刚开始使用numpy.scipy这些模块的时候,图个方便直接使用了一个叫做Enthought的软件.Enthought ...

  5. 目前比较流行的Python科学计算发行版

    经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...

  6. Python科学计算之Pandas

    Reference: http://mp.weixin.qq.com/s?src=3&timestamp=1474979163&ver=1&signature=wnZn1UtW ...

  7. Python 科学计算-介绍

    Python 科学计算 作者 J.R. Johansson (robert@riken.jp) http://dml.riken.jp/~rob/ 最新版本的 IPython notebook 课程文 ...

  8. Python科学计算库

    Python科学计算库 一.numpy库和matplotlib库的学习 (1)numpy库介绍:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成 ...

  9. Python科学计算基础包-Numpy

    一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能: 快速高效的多维数组对象ndarray. 用于对数组执行元素级计算以及直接对数 ...

随机推荐

  1. 测试平台系列(85) 把redis运用到实战中

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...

  2. 洛谷 P4099 - [HEOI2013]SAO(树形 dp)

    题面传送门 题意: 有一个有向图 \(G\),其基图是一棵树 求它拓扑序的个数 \(\bmod (10^9+7)\) \(n \in [1,1000]\) 如果你按照拓扑排序的方法来做,那恐怕你已经想 ...

  3. 洛谷 P3643 - [APIO2016]划艇(dp)

    题面传送门 一道难度中等的 \(dp\)(虽然我没有想出来/kk). 首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转 ...

  4. Atcoder Regular Contest 096 C - Everything on It(组合数学)

    Atcoder 题面传送门 & 洛谷题面传送门 简单题,由于这场 arc 的 F 是 jxd 作业而我不会做,所以只好来把这场的 E 水掉了. 我们记 \(f(i)\) 为钦定 \(i\) 个 ...

  5. NOIP2020 模拟赛 B 组 Day6

    非常巧妙的一场模拟赛,比较偏向于 Atcoder 的风格,考场上做出了 A .C 两题. A. 礼物购买 排完序后一个个礼物地枚举时间复杂度是\(\Theta(nm)\)的,不能接受.但是注意到,若当 ...

  6. HDC2021技术分论坛:异构组网如何解决共享资源冲突?

    作者:lijie,HarmonyOS软总线领域专家 相信大家对HarmonyOS的"超级终端"比较熟悉了.那么,您知道超级终端场景下的多种设备在不同环境下是如何组成一个网络的吗?这 ...

  7. keras房价预测数据集boston_housing.npz文件下载

    github地址: https://github.com/yuxiwang66/boston_housing 码云地址: https://gitee.com/polarisslk/boston_hou ...

  8. Django url中可以使用类视图.as_view()进行映射的原因

    说明:在练习天天生鲜项目时,对利用类视图去与正则匹配到的url做映射有点疑惑,经过查看他人博客以及自我分析算是整明白了,所以记录一下 参考:https://www.zmrenwu.com/post/5 ...

  9. 顺序栈(C++)

    栈的定义为只允许在表的末端进行插入和删除的线性表.简而言之就是先进后出的线性表. 插入和删除的一端被称呼为栈顶(top),而不允许插入删除的一端被称为栈底(bottom).无元素时的栈即为空栈. 使用 ...

  10. redis安装与简单实用

    1.在Linux上redis的安装时十分简单的: 第一步:wget http://download.redis.io/releases/redis-2.8.12.tar.gz 解压: tar zxvf ...