今天将 性能测试网站: 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 语言新的性能测试的更多相关文章

  1. Nim语言的模块化编程

    前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的 ...

  2. 学习Nim语言.rar(nim语言中文教程下载)

    学习Nim语言 nim 语法上类似python ,是一门静态编译型语言,nim 使用空格缩进标示语句块的开始和结束, 喜欢python风格的程序员应该也会很容易适应和喜欢nim的风格. nim语言官方 ...

  3. Nim语言:Pascal的语法,Python的缩进

    http://nim-lang.org/ 德国人Andreas Rumpf的作品,原因是他对过去使用的每种语言都不满意(Pascal也不满意?).以前叫Nimrod语言,从0.96版本开始改名为Nim ...

  4. (转)C++0x语言新特性一览

    转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...

  5. iOS - OC 语言新特性

    前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 O ...

  6. iOS - Swift Swift 语言新特性

    1.Swift 2.0 带来哪些新变化 常规变化: 1.OS X 10.11.iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, ...

  7. OC 语言新特性

    前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力. 在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 ...

  8. 关于 Swift 2.0 - 语言新特性与革新

    随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都 ...

  9. 用Nim语言开发windows GUI图形界面程序

    前言 本文得到了“樂師”的大力支持, 我们一起调试程序到深夜,要是没有他的帮忙, 我不知道要多久才能迈过这道坎, 另外“归心”还有其他人也提供了帮助, 他们都来自于QQ群:“Nim开发集中营”4693 ...

  10. [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等

    1.1 mysql-cluster简介 简单的说,MySQLCluster实际上是在无共享存储设备的情况下实现的一种完全分布式数据库系统,其主要通过NDBCluster(简称NDB)存储引擎来实现. ...

随机推荐

  1. DataV过滤器

    人才库: return data.filter(function (item) { return item.职级 === ''; }) 区县分析:   //一级指标 const t = Object. ...

  2. rabbitmq不同模式的区别

    RPC模式

  3. AI之Ollama

    介绍 什么是llama LLaMA(Large Language Model Meta AI)是Meta开发的大规模预训练语言模型,基于Transformer架构,具有强大的自然语言处理能力.它在文本 ...

  4. What?废柴, 还在本地部署DeepSeek吗?Are you kidding?

    前言 DeepSeek推出更强大的推理模型DeepSeek R1后一发不可收拾,迅速火遍全球,用户暴增,但巨大的流量以及一些不可控因素,DeepSeek官网变得极不稳定,经常出现"网络繁忙& ...

  5. .NET程序员AI开发基座:Microsoft.Extensions.AI

    大家好,我是Edison. 微软在2024年11月就发布了新的AI核心库Microsoft.Extensions.AI,虽然目前还是一个预览版,但其可以大大简化我们的AI集成和开发工作. Micros ...

  6. flutter3-trip仿携程酒店预订|Flutter3.27+Getx预约旅游酒店App程序

    基于Flutter3.x+Dart3+GetX跨平台仿携程/飞猪旅行酒店客房预订查询app系统. flutter3_trip原创2025新版flutter3.27.1+dart3.6+getx+flu ...

  7. tortoiseGit no git.exe found

    运行tortoiseGit之后显示找不到git.exe 原因:没有安装git,tortoiseGit是在安装了git的基础上运行的 到这里下载git并安装:https://gitforwindows. ...

  8. 【Unity】热更新原理与Xlua配置

    [Unity]热更新原理与 Xlua 配置 热更新 直接理解即是让代码可以像资源包一样被运行时更新.当然它其实还一个名称叫热修复,即实现不重新打包项目也能把 Bug 修好,这也正是它常用的地方. 原理 ...

  9. 【BUUCTF】HardSQL

    [BUUCTF]HardSQL 题目来源 收录于:BUUCTF 极客大挑战 2019 题目描述 一道纯粹的SQL注入题 尝试进行注入,发现对以下字符进行了过滤: = %20(空格) %09 %0a % ...

  10. CUDA与Cython之BatchGather

    技术背景 在前面一篇文章中,我们介绍过Cython+CUDA框架下实现一个简单的Gather算子的方法.这里演示Gather算子的升级版本实现--BatchGather算子.不过这里只是加了一个Bat ...