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)存储引擎来实现. ...
随机推荐
- redis安装、多实例和配置、及服务器性能优化
同一台服务器部署不同应用或者同一应用部署不同环境,需要redis服务多开防止数据冲突问题. 一.安装redis 需要安装gcc编译工具 yum install gcc -y 源码安装默认Redis程序 ...
- linux mint安装hadoop
一.安装 安装ssh openssh-server 配置jdk环境变量~/.bashrc参考 export JAVA_HOME=/opt/jdk1.7.0_55/ export JRE_HOME= ...
- Flink程序异常--CommunicationsException: The last packet successfully received from the server was
一.异常截图 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully receive ...
- css快速入门系列 —— 移动开发闲谈
移动开发闲谈(Flex和css 库) 背景 目前在做移动小程序开发,效果必须和设计稿一模一样,一个像素都不能有差异. 虽然公司也提供了图生文的工具,但是有时生成的代码可读性不太好,二次修改也比较费劲, ...
- 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
大家好!今天给大家带来一个好消息,Dapr(Distributed Application Runtime)1.15版本正式发布啦!对于不熟悉Dapr的朋友来说,Dapr是一个开源的.跨平台的运行时, ...
- 震惊!AI 编程竟然让程序员 “失业” 了?真相让人意外
在科技飞速发展的当下,AI 编程的异军突起无疑成为了整个编程领域乃至社会各界热议的焦点. 去年,全球首个AI程序员Devin横空出世,不仅能独立完成代码开发.修复Bug,甚至能通过阅读技术文档自主学习 ...
- WPF如何使用WebView,并且禁用F12和F5。
客户端套浏览器壳,是如今比较浏览的客户端客户端开发方式.这篇文字简单来介绍一下如何在WPF中使用WebView 安装WebView的nuget包 可以直接执行安装命令 Install-Package ...
- python ImportError: libGL.so.1: cannot open shared object file: No such file or directory
前言 python 报错python ImportError: libGL.so.1: cannot open shared object file: No such file or director ...
- mongodb关机重启
正确关闭 mongodb 查看 mongodb 进程 ps -ef | grep mongodb # 或者 ps -aux | grep mongodb 杀掉 mongodb 进程(不推荐) kill ...
- protobuf优缺点及编码原理
什么是protobuf protobuf(Google Protocol Buffers),官方文档对 protobuf 的定义:protocol buffers 是一种语言无关.平台无关.可扩展的序 ...