zoukankan      html  css  js  c++  java
  • Rust初步(五):Rust与C#性能比较

    我学习Rust的目的并不是说期望用它来取代掉现有的开发平台或语言。相反,我认为当前绝大部分研发团队,都不可能只用一个平台或者一个语言。

    当组织增长,他们越来越依赖大量的编程语言。不同的编程语言有不同的能力和弱点,而一个多语言栈让你在某个特定的编程语言的优点起作用的时候能使用它,当它有缺陷时使用其他编程语言。

    Rust 主要擅长的领域是:数值计算和线程。

    我下面用一个实例来比较一下Rust和C#的性能方面表现。这个实例很简单,我们准备开启10个线程,然后在每个线程里面运行一个数值累加的工作任务(500万次。

    注意,以下测试的耗时,可能在各位的电脑上面会因为配置的不同而不同。我的配置如下

    image

    Rust的程序

    extern crate time;
    
    use std::thread;
    use time::*;
    
    fn main(){
    
    
        let start = time::now();//获取开始时间
    
        let handles :Vec<_> =(0..10).map(|_|{
            thread::spawn(||{
                let mut x= 0;
                for _ in (0..5_000_000){
                    x+=1
                }
                x
            })
        }).collect();
        for h in handles{
            println!("Thread finished with count={}",h.join().map_err(|_| "Could not join a thread!").unwrap());
        }
    
        let end = time::now();//获取结束时间
        let duration = end - start;
    
        println!("耗时:{}",duration);
    }
    

    需要注意的是,为了做耗时统计,我们采用了time这个crate,如果有不清楚,请参考我之前的文章:

    Rust初步(四):在rust中处理时间

    这个程序,在debug模式下运行的耗时大约是 0.55秒

    image

    在release模式下运行的耗时大约是 0.002秒

    image

    C#的程序:

    using System;
    using System.Threading.Tasks;
    using System.Diagnostics;
    using System.Threading;
    
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Stopwatch watch = new Stopwatch();
                watch.Start();
    
                Parallel.For(0, 10, i =>
                {
                    var x = 0;
                    for (int j = 0;  j< 5000000; j++)
                    {
                        x += 1;
                    }
                    Console.WriteLine("线程:{0} 完成计数",Thread.CurrentThread.ManagedThreadId);
                });
    
    
                watch.Stop();
                Console.WriteLine("耗时:{0}秒", watch.Elapsed.TotalSeconds);
                Console.Read();
            }
        }
    }
    

    在Debug模式下面运行的耗时约为0.06秒

    image

    在Release模式下运行的耗时约为0.012秒

    image

    汇总下来比较的结果如下

    image

    应该说C#新版本中对多线程管理是有了很大的提升的(包括语法很简化)。在Release模式下还是比较慢,是因为Rust是没有运行时的,而C#是要经过CLR运行的。

    不过,在Debug模式下,居然C#大幅度胜出了,我感到很意外。从数值上来说,只能说Rust在Debug模式下很慢(可能做了很多事情?)

  • 相关阅读:
    poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)
    poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
    poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)
    hdu 5256 最少修改多少个数 能使原数列严格递增 (LIS)
    hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
    Gym 100512F Funny Game (博弈+数论)
    UVa 12714 Two Points Revisited (水题,计算几何)
    UVa 12717 Fiasco (BFS模拟)
    UVa 12718 Dromicpalin Substrings (暴力)
    UVa 12716 && UVaLive 6657 GCD XOR (数论)
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/4760172.html
Copyright © 2011-2022 走看看