C# 如何使用2*Xeon E5的电源?

C# 如何使用2*Xeon E5的电源?,c#,C#,我有两台服务器,一台运行一个E3-1220处理器,另一台运行两个E5-2640处理器 问题是,两个处理器的服务器比我的程序贵5倍,执行速度慢2倍,请参阅我关于stackoverflow的问题) 我编写了这个简单的程序来比较E3-1220和E5-2640 它什么都没做,只是我在现实世界中做的事情: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Sy

我有两台服务器,一台运行一个E3-1220处理器,另一台运行两个E5-2640处理器

问题是,两个处理器的服务器比我的程序贵5倍,执行速度慢2倍,请参阅我关于stackoverflow的问题)

我编写了这个简单的程序来比较E3-1220和E5-2640 它什么都没做,只是我在现实世界中做的事情:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace TestSpeed
{
    class Program
    {
        private static double a;
        private static double b;
        private static double c = 0.34;
        private static double d = 0.15;
        private static double e = 0.25;
        private static double f = 0.03;
        private static double g = 8;

        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < 1000000000; i++)
            {
                double e = a;
                a = 1;
                double f = b;
                b = 1;
                if (true)
                {
                    double h = 1.83;

                    double j = Math.Ceiling(h/d);
                    if (j <= c)
                    {
                        c = Math.Ceiling(h/d + e);
                    }
                    else if (j > c)
                    {
                        c = Math.Ceiling(h/d - e);
                    }
                    if (c <= -0.5)
                    {
                        a = a - f*c;
                    }

                    double k = Math.Floor(h/d);
                    if (k <= g)
                    {
                        g = Math.Floor(h/d + e);
                    }
                    else if (k > g)
                    {
                        g = Math.Floor(h/d - e);
                    }
                    if (g > 0.5)
                    {
                        b = b + f*g;
                    }
                }

                bool result = (Math.Abs(e - a) > 0) ||
                              (Math.Abs(f - b) > 0);
            }
            long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
            Console.WriteLine(time);

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.Linq;
使用系统文本;
命名空间测试速度
{
班级计划
{
私有静态双a;
私有静态双b;
专用静态双c=0.34;
专用静态双d=0.15;
专用静态双e=0.25;
专用静态双f=0.03;
专用静态双g=8;
静态void Main(字符串[]参数)
{
秒表sw=Stopwatch.StartNew();
对于(int i=0;i<100000000;i++)
{
双e=a;
a=1;
双f=b;
b=1;
如果(真)
{
双h=1.83;
双j=数学上限(h/d);
如果(j c)
{
c=数学上限(h/d-e);
}
if(c0.5)
{
b=b+f*g;
}
}
布尔结果=(Math.Abs(e-a)>0)||
(数学Abs(f-b)>0);
}
长时间=sw.ElapsedTicks/(秒表频率/(1000L*1000L));
控制台写入线(时间);
}
}
}
E5-2640是新的英特尔处理器,我想它至少比以前的E3-1220要好一点,后者几乎便宜5倍

但结果是:至强E5-2640为31182(~31秒),至强E3-1220为26650(~26秒)。 所以这个比率是31182/26650=1.17 时钟比为3/2.5=1.2

所以至强E3和至强E5之间绝对没有区别。E3的时钟比高20%,因此工作速度快20%。我能做些什么,也许我能以某种方式使用一些特殊的Xeon E5指令

而且非常恼人的是,在实际应用中,Xeon E5比Xeon E3慢2倍(!!)。。。(请参阅我的相关问题)

所以问题是-我能做些什么来使用2*Xeon E5配置的功率?我应该使用什么技术来指导如何在C#上编程以利用多处理器配置的强大功能


我刚刚指出,我花了10000美元购买了一台服务器,该服务器执行程序的速度比我花1500美元购买的现有服务器慢2倍。根据我的一点经验,Task Parallel Library在创建适当数量的线程以最大化CPU方面做了大量工作。首先,这个测试不能决定哪台服务器是最好的(10000美元还是1500美元),因为价格中包括了一些东西,比如材料质量、电源、高清等。你的测试可以计算算术运算量(主要涉及处理器和内存总线)

在我的Xeon E5410@2.33GHz-4GB RAM(虚拟机-4核)中,我得到了以下结果:

425872098
Time Elapsed: 00:05:56.9214226
但最大的错误是:服务器只使用了25%的功率(1个核心)

因此,我使用了4个内核,这4个内核以100%的功率耗尽

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestSpeed
{
    class Program
    {
        private static double a;
        private static double b;
        private static double c = 0.34;
        private static double d = 0.15;
        private static double e = 0.25;
        private static double f = 0.03;
        private static double g = 8;

        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();
            Parallel.For(0, 1000000000, (p) =>
            {
                double e = a;
                a = 1;
                double f = b;
                b = 1;
                if (true)
                {
                    double h = 1.83;

                    double j = Math.Ceiling(h / d);
                    if (j <= c)
                    {
                        c = Math.Ceiling(h / d + e);
                    }
                    else if (j > c)
                    {
                        c = Math.Ceiling(h / d - e);
                    }
                    if (c <= -0.5)
                    {
                        a = a - f * c;
                    }

                    double k = Math.Floor(h / d);
                    if (k <= g)
                    {
                        g = Math.Floor(h / d + e);
                    }
                    else if (k > g)
                    {
                        g = Math.Floor(h / d - e);
                    }
                    if (g > 0.5)
                    {
                        b = b + f * g;
                    }
                }

                bool result = (Math.Abs(e - a) > 0) ||
                              (Math.Abs(f - b) > 0);
            });
            sw.Stop();
            long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
            Console.WriteLine(time);
            Console.WriteLine(sw.Elapsed.ToString());
            Console.Read();
        }
    }
}

差不多一分钟,好吧,这意味着无论您可以同时运行多少线程,差异都很小。可能缓存(L1或L2)不足以容纳一些变量并强制执行更多RAM往返,或者可能答案不在处理器中,而是在您的代码中

我正在密集使用
任务,但便宜的Xeon E3-1220仍在使用faster@javapowered是的,首先检查您的代码是否有问题,在目标系统上使用探查器运行。虽然不是一个c#er,但问题可能不是每个任务都太小,以至于大部分工作都花费在调度任务的开销上?如果您以不同的方式划分工作,例如在中,会发生什么情况?
359930438
Time Elapsed: 00:05:01.6560249