热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:关于c++gonodejspython的计算性能测试,结果令人惊讶

篇首语:本文由编程笔记#小编为大家整理,主要介绍了关于c++gonodejspython的计算性能测试,结果令人惊讶相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了关于c++gonodejspython的计算性能测试,结果令人惊讶相关的知识,希望对你有一定的参考价值。





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

计算性能在计算密集型的服务上,是非常重要的, 一直以为,在计算性能上,肯定是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
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
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
#include

#include

#include

#include
<string>
#include

#include

struct Data
double x;
double y;
int a;
;
std::vector
MakeData(int num)
std::vector
vec;
vec.reserve(num);
for (int i=0; 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, 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)
std::vector
<double> target;
target.reserve(data.size());
for (int i = 0; i )
auto v = Cal(data, i, 1000);
if (v > 1000)
target.push_back(v);


std::cout
<<"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: " < 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)
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 )
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)

 



推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • 在编译 PHP7 的 PDO MySQL 扩展时,可能会遇到 `[mysql_driver.lo]` 错误 1。该问题通常出现在 `pdo_mysql_fetch_error_func` 函数中。本文详细介绍了导致这一错误的常见原因,包括依赖库版本不匹配、编译选项设置不当等,并提供了具体的解决步骤和调试方法,帮助开发者快速定位并解决问题。 ... [详细]
  • R语言中向量(Vector)数据类型的元素索引与访问:利用中括号[]和赋值操作符在向量末尾追加数据以扩展其长度
    在R语言中,向量(Vector)数据类型的元素可以通过中括号 `[]` 进行索引和访问。此外,利用中括号和赋值操作符,可以在向量的末尾追加新数据,从而动态地扩展向量的长度。这种方法不仅简洁高效,还能灵活地管理向量中的数据。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • Java排序算法详解:选择排序、插入排序、冒泡排序与递归实现
    本文详细解析了Java中的几种基础排序算法,包括选择排序、插入排序和冒泡排序,并探讨了递归在这些算法中的应用。选择排序通过每次找到未排序部分的最小值并将其置于已排序部分的末尾来实现;插入排序则通过逐步将每个元素插入到已排序序列的正确位置;而冒泡排序则是通过多次遍历数组,两两比较并交换相邻的元素,最终使较大的元素逐渐“冒”到数组末尾。文章还提供了具体的代码示例,帮助读者更好地理解和掌握这些算法的实现细节。 ... [详细]
author-avatar
dmcm0011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有