比较Rust、D、Go的单线程的运算、内存占用,Rust 1.0 alpha2(64位) ,D 2.066.1(ldc2编译器0.15.1(基于llvm3.6 msvc64))、Go 1.4.2(64位),基于win7 64位平台. 为让内存有变化,特意加入字典或关联数组.
比较2点:1、使用内存,2、运行时长。
(注:虽然此题已在 以下两篇文章中以“数学公式”法做过比较,但对运行效率的比较意义不大。
http://blog.csdn.net/iilovetopview/article/details/43745059
http://blog.csdn.net/iilovetopview/article/details/43913027
http://blog.csdn.net/iilovetopview/article/details/43960963
)
/*题目:
有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
比如f(13)=6,现在f(1)=1,问下一个最大的f(n)=n的n是什么?
*/
一、用穷举法查5万以内的数,并显示出函数结果。
1、Rust:
use std::time::duration::Duration;
use std::collections::HashMap;
fn main() {
println!("(Rust Language) Please wait for some minutes,will found Next Fn(n) = n ,the n is:");
let r = Duration::span(fnx);
println!(" time :{} seconds",r.num_seconds());
}
fn fnx()
{
let ( mut pos,mut n ,mut count,mut y)=(0,1,0,0);
let mut aa: HashMap = HashMap::new();
while(n <= 50000)
{
y+=1;
pos = Fx(n);
aa.insert(n,pos);
print!("{},",pos);
if(n == pos)
{
count +=1;
println!("n is: {0}, Fn(n) is:{1} ",n,pos);
if(count >1) {break;}
}
if(y ==10)
{
print!("\r\n");
y =0;
}
n+=1;
}
println!("{} stop",n);
}
fn Fx (n: usize) -> usize
{
let mut total =0;
for i in 0..n+1{
total += Count(i);
}
return total;
}
fn Count(n: usize) ->usize
{
let (mut num,mut t) = (0,n);
while(t >= 1)
{
if(t%10 ==1){num +=1;}
t /= 10;
}
return num;
}
编译命令:rustc -O fnall5.rs
2、D:
module Fnall5;
import std.stdio;
import std.array;
import std.conv;
import std.datetime;
void main()
{
writeln("(D language) Please wait for some minutes,will found Next Fn(n) = n ,the n is:");
int n =1;
int count,pos,y;
int[int] aa;
StopWatch sw;
sw.start();
while(n <= 50000)
{
y++;
pos = Fn(n);
aa[n] = pos;
write(pos,",");
if(n == pos)
{
count++;
writeln("n is: ",n, " Fn(n) is: ",pos);
if(count >1) break;
}
if(y == 10)
{
y = 0;
writeln();
}
n++;
}
sw.stop();
writeln(" time :" , sw.peek().seconds," seconds");// msecs/1000.0
writeln(n," stop");
}
int Fn(int n)
{
int total;
for(int i=0;i<=n;i++)
{
total += Count(i);
}
return total;
}
int Count(int n)
{
int num;
for(int t = n;t >=1;t=t/10)
{
if(t%10 == 1) num++;
}
return num;
}
编译命令:ldc2 -m64 -O -release fnall5.d
3.Go:
package main
import ("fmt"
"time"
)
func main() {
fmt.Println("(go Language) Please wait for some minutes,will found Next Fn(n) = n ,the n is:")
n := 1
count :=0
pos := 0
aa := make(map[int]int)
y:=0
t :=time.Now()
for n =1;n<=50000;n++ {
pos = Fn(n)
aa[n] = pos
y++
fmt.Print(pos,",")
if n == pos {
count++
fmt.Println("n is :",n," Fn(n) is :",pos)
if(count >1) {break}
}
if(y == 10){
y =0
fmt.Println()
}
}
fmt.Println("time is :",time.Now().Sub(t).String())
fmt.Println(n," stop")
}
func Fn(n int) int {
var total int
for i:=0;i<=n;i++ {
total += Count(i)
}
return total
}
func Count(n int) int{
var num int
for t := n;t >=1;t=t/10 {
if(t%10 == 1) {
num++
}
}
return num
}
编译命令:go build -ldflags "-s -w" fnall5.go
内存占用:
----------------------------------------------------------------------------------------------
二、穷举法查10万以内的数。
1、Rust:(此处只列出与“5万”不同的代码)
fn fnx()
{
let ( mut pos,mut n ,mut count)=(0,1,0);
let mut aa: HashMap = HashMap::new();
while(n <=100000)
{
pos = Fx(n);
aa.insert(n,pos);
if(n == pos)
{
count +=1;
println!("n is: {0}, Fn(n) is:{1} ",n,pos);
if(count >1) {break;}
}
n+=1;
}
println!("{} stop",n);
}
内存占用:
2、D:
void main()
{
writeln("(D language) Please wait for some minutes,will found Next Fn(n) = n ,the n is:");
int n =1;
int count,pos;
int[int] aa;
StopWatch sw;
sw.start();
while(n <= 100000)
{
pos = Fn(n);
aa[n] = pos;
if(n == pos)
{
count++;
writeln("n is: ",n, " Fn(n) is: ",pos);
if(count >1) break;
}
n++;
}
sw.stop();
writeln(" time :" , sw.peek().seconds," seconds");//1000.0
writeln(n," stop");
}
3、go:
func main() {
fmt.Println("(go Language) Please wait for some minutes,will found Next Fn(n) = n ,the n is:")
n := 1
count :=0
pos := 0
aa := make(map[int]int)
t :=time.Now()
for n =1;n<=100000;n++ {
pos = Fn(n)
aa[n] = pos
if n == pos {
count++
fmt.Println("n is :",n," Fn(n) is :",pos)
if(count >1) {break}
}
}
fmt.Println("time is :",time.Now().Sub(t).String())
fmt.Println(n," stop")
}
内存占用:
三、继续求20万以内的结果(代码与10万的基本相同,只是数值修改为200000)
1、Rust:
内存占用:
2、D:
内存占用:
3、Go:
内存占用: