日期:2014-05-20  浏览次数:20767 次

【300分散分,推荐一个不新不老的技术】我们写的程序真正用到多核了结构的能量了吗?
假设我们要把一个目录下的所有文件和子目录复制到另外一个目录下,我们如何让运行时间只有原来的一半,甚至四分之一?!

首先你可以下载微软 Parallel Extensions to the .NET Framework 的2008年6月预览版,这是一个大概300k左右的dll,放入你的项目,可以引用他的 using System.Threading 命名空间,你就可以写出代码:
C# code
private static void CopyDir(DirectoryInfo s, DirectoryInfo d)
{
    if (!d.Exists)
        d.Create();
    Parallel.Invoke(
        () =>
        {
            Parallel.ForEach(s.GetFiles(), f =>
                {
                    var t = new FileInfo(Path.Combine(d.FullName, f.Name));
                    f.CopyTo(t.FullName);
                    Total++;
                });
        },
        () =>
        {
            Parallel.ForEach(s.GetDirectories(), subs =>
              {
                  var subd = new DirectoryInfo(Path.Combine(d.FullName, subs.Name));
                  CopyDir(subs, subd);
              });
        });
}



这里,方法“Parallel.Invoke”是让作为其参数的两个匿名方法并行运行。而方法“Parallel.ForEach”则是让参数中的各个文件和子目录处理并行执行。我们可以这样写一个测试
C# code
private static TimeSpan Test()
{
    var w = new Stopwatch();
    w.Start();
    CopyDir(new DirectoryInfo("e:\\test"), new DirectoryInfo("e:\\test1"));
    w.Stop();
    return w.Elapsed;
}



你的计算机是双核的?还是更多核的?不论有几核,我想当你对比了传统的顺序执行程序与这个程序的“效率”,都会印象深刻。


这个framework据说将集成为.net framework4.0中的核心功能之一。除了上面举例的两个功能以外,还包括了并行Linq等技术。不过我们现在就可以使用这个针对.net framework3.5的语言版组件来优化我们的报表计算等许多费时的工作。

------解决方案--------------------
收藏
------解决方案--------------------
不错
------解决方案--------------------
mark...
------解决方案--------------------
收藏之...
------解决方案--------------------
收藏,学习
------解决方案--------------------
学习 
谢谢 
楼主是好人!
------解决方案--------------------
吴老大的贴子那是必须要重视的。
------解决方案--------------------
学习:)
------解决方案--------------------
看到了
------解决方案--------------------
向楼主看齐~~