Nim 语言新的性能测试
今天将 性能测试网站: benchmarks game 上一个关于 n-body 的题目改成 nim 1.6.4 语言来编写。
注意,我是基于 java 的版本来写的,没有像 c++ 那样的版本使用 SIMD 技术,因为我认为,我纯粹是为了看看编译器,在执行普通的方法,其效率如何。
import std/math const
PI = 3.141592653589793
SOLAR_MASS = 4 * PI * PI
DAYS_PER_YEAR = 365.24
LENGTH = 5 type
Body = ref object
x : float64
y : float64
z : float64
vx : float64
vy : float64
vz : float64
mass : float64 NNodySystem = ref object of RootObj
bodies : seq[Body] proc offsetMomentum(this : var Body, px : float64, py : float64, pz : float64) =
this.vx = -px / SOLAR_MASS
this.vy = -py / SOLAR_MASS
this.vz = -pz / SOLAR_MASS proc jupiter() : Body =
Body(
x : 4.84143144246472090e+00,
y : -1.16032004402742839e+00,
z : -1.03622044471123109e-01,
vx : 1.66007664274403694e-03 * DAYS_PER_YEAR,
vy : 7.69901118419740425e-03 * DAYS_PER_YEAR,
vz : -6.90460016972063023e-05 * DAYS_PER_YEAR,
mass : 9.54791938424326609e-04 * SOLAR_MASS
) proc saturn() : Body =
Body(
x : 8.34336671824457987e+00,
y : 4.12479856412430479e+00,
z : -4.03523417114321381e-01,
vx : -2.76742510726862411e-03 * DAYS_PER_YEAR,
vy : 4.99852801234917238e-03 * DAYS_PER_YEAR,
vz : 2.30417297573763929e-05 * DAYS_PER_YEAR,
mass : 2.85885980666130812e-04 * SOLAR_MASS
) proc uranus() : Body =
Body(
x : 1.28943695621391310e+01,
y : -1.51111514016986312e+01,
z : -2.23307578892655734e-01,
vx: 2.96460137564761618e-03 * DAYS_PER_YEAR,
vy: 2.37847173959480950e-03 * DAYS_PER_YEAR,
vz: -2.96589568540237556e-05 * DAYS_PER_YEAR,
mass : 4.36624404335156298e-05 * SOLAR_MASS
) proc neptune() : Body =
Body(
x : 1.53796971148509165e+01,
y : -2.59193146099879641e+01,
z : 1.79258772950371181e-01,
vx : 2.68067772490389322e-03 * DAYS_PER_YEAR,
vy : 1.62824170038242295e-03 * DAYS_PER_YEAR,
vz : -9.51592254519715870e-05 * DAYS_PER_YEAR,
mass : 5.15138902046611451e-05 * SOLAR_MASS
) proc sun() : Body =
Body(
mass : SOLAR_MASS
) proc newBodySystem() : NNodySystem =
result = NNodySystem(
bodies : @[sun(),jupiter(),saturn(),uranus(),neptune()]
)
var px,py,pz = 0.0
var bodies = result.bodies
for i in 0 ..< LENGTH:
px += bodies[i].vx * bodies[i].mass
py += bodies[i].vy * bodies[i].mass
pz += bodies[i].vz * bodies[i].mass
bodies[0].offsetMomentum(px,py,pz) proc advance(this: NNodySystem, dt : float64) =
let b = this.bodies
for i in 0 ..< LENGTH - 1:
var iBody = b[i]
let iMass = iBody.mass
let ix = iBody.x
let iy = iBody.y
let iz = iBody.z
for j in i+1 ..< LENGTH:
var jBody = b[j]
let dx = ix - jBody.x
let dy = iy - jBody.y
let dz = iz - jBody.z
let dSquared = dx * dx + dy * dy + dz * dz
let distance = sqrt(dSquared)
let mag = dt / (dSquared * distance)
let jMass = jBody.mass
iBody.vx -= dx * jMass * mag
iBody.vy -= dy * jMass * mag
iBody.vz -= dz * jMass * mag
jBody.vx += dx * iMass * mag
jBody.vy += dy * iMass * mag
jBody.vz += dz * iMass * mag
for i in 0 ..< LENGTH:
var body = b[i]
body.x += dt * body.vx
body.y += dt * body.vy
body.z += dt * body.vz proc energy(this : NNodySystem) : float64 =
var dx,dy,dz,distance,e : float64
for i, iBody in this.bodies:
e += 0.5 * iBody.mass * (iBody.vx * iBody.vx + iBody.vy * iBody.vy + iBody.vz * iBody.vz)
for j in i + 1 ..< this.bodies.len:
let jBody = this.bodies[j]
dx = iBody.x - jBody.x
dy = iBody.y - jBody.y
dz = iBody.z - jBody.z
distance = sqrt(dx * dx + dy * dy + dz * dz)
e -= iBody.mass * jBody.mass / distance return e proc main(n : int32) =
let bodies = newBodySystem()
echo bodies.energy()
for i in 0 ..< n:
bodies.advance(0.01)
echo bodies.energy() main(50000000)
使用 release 编译
nim c -d:release .\NBodyTestX64.nim
在我的机器上,java 版本接近 5秒,而 nim 的版本,需要 5.5 秒。
我也实验了 Kotlin native 1.6.20,仍然需要8~9秒。
Nim 语言新的性能测试的更多相关文章
- Nim语言的模块化编程
		前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的 ... 
- 学习Nim语言.rar(nim语言中文教程下载)
		学习Nim语言 nim 语法上类似python ,是一门静态编译型语言,nim 使用空格缩进标示语句块的开始和结束, 喜欢python风格的程序员应该也会很容易适应和喜欢nim的风格. nim语言官方 ... 
- Nim语言:Pascal的语法,Python的缩进
		http://nim-lang.org/ 德国人Andreas Rumpf的作品,原因是他对过去使用的每种语言都不满意(Pascal也不满意?).以前叫Nimrod语言,从0.96版本开始改名为Nim ... 
- (转)C++0x语言新特性一览
		转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ... 
- iOS - OC      语言新特性
		前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 O ... 
- iOS - Swift Swift		语言新特性
		1.Swift 2.0 带来哪些新变化 常规变化: 1.OS X 10.11.iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, ... 
- OC 语言新特性
		前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力. 在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 ... 
- 关于 Swift 2.0 - 语言新特性与革新
		随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都 ... 
- 用Nim语言开发windows GUI图形界面程序
		前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”4693 ... 
- [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等
		1.1 mysql-cluster简介 简单的说,MySQLCluster实际上是在无共享存储设备的情况下实现的一种完全分布式数据库系统,其主要通过NDBCluster(简称NDB)存储引擎来实现. ... 
随机推荐
- Netty实战入门教程
			概述 Netty 是一个异步的.基于事件驱动的网络应用框架,用于快速开发可维护.高性能的网络服务器和客户端 Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开 ... 
- Django项目与Vue的集成
			Django项目与Vue的集成 在现代Web开发领域,前后端分离已成为一种主流趋势.Django,作为一个强大的Python Web框架,以其丰富的功能和高度的可扩展性而受到开发者的青睐.而Vue.j ... 
- SQL注入的业务场景以及危害
			SQL注入的业务场景以及危害 在现代Web应用中,数据库是存储和检索数据的核心组件.然而,当Web应用未能正确验证和过滤用户输入时,就可能会遭受SQL注入攻击.SQL注入是一种严重的安全漏洞,它允许攻 ... 
- [记录点滴] OpenResty中Redis操作总结
			[记录点滴] OpenResty中Redis操作总结 0x00 摘要 本文总结了在OpenResty中的操作,与大家分享,涉及知识点为Openresty, Lua, Redis. 0x01 操作记录 ... 
- 6.App.vue配置
			1.修改<div id="app">指定动态路由,可以设置导航栏 <div id="app"> <!-- 导航栏 --> & ... 
- 清华大学推出的 DeepSeek 从入门到精通(104页)免费教程!
			前言 最近 DeepSeek 的出现让 AI 在国内掀起了一股浪潮,各大媒体.平台都在讨论和推广 DeepSeek,帮助各行各样使用 AI 不再有困难.今天大姚给大家分享一个由清华大学推出的.免费的: ... 
- windows jdk环境变量配置
			新建环境变量[classpath]变量值为[.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar] 新建环境变量[JAVA_HOME]变量值为jdk的安装目录 如:[ ... 
- 洛谷P1983 [NOIP2013 普及组] 车站分级 题解
			思路 由题可知,在一趟车次的区间内,停靠的站点的等级恒大于不停靠的站点. 因此,对于每一趟车次的区间,给所有停靠的站点向所有不停靠的站点两两连有向边,然后求图中最长的路径长度,就能得到答案. 实现 因 ... 
- 不到24小时,AOne让全员用上DeepSeek的秘诀是……
			DeepSeek引发新一轮AI浪潮,面对企业数字化智能升级与数据安全红线的急迫需求,IT负责人的压力山大!如何在24小时内实现全员AI落地,同时为后续安全部署铺平道路? Step1:一键开启全员智能时 ... 
- CF1693F题解
			备注 发表时间:2023-06-17 21:51 前言 yny 学长来 cdqz 讲课,写一篇讲课的题的题解纪念一下. 题意 给你一个 01 序列,有以下操作: 选择一段区间 设 \(cnt_0,cn ... 
