我有两台服务器,一台运行一台E3-1220处理器,另一台运行两台E5-2640处理器。 http://ark.intel.com/compare/52269,64591
问题是两个处理器服务器的价格要贵5倍,执行程序的速度要慢2倍,请参阅我在stackoverflow上的问题Threadpool program runs much slower on much faster server)
我写了这个简单的程序来比较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);
}
}
}
E5-2640是全新的英特尔处理器,我认为它应该比以前的E3-1220至少好一点,差不多便宜5倍。
但结果是:Xeon E5-2640是31182(~31秒),Xeon E3-1220是26650(~26秒)。 因此比率为31182/26650 = 1.17 时钟比为3 / 2.5 = 1.2
所以Xeon E3和Xeon E5之间绝对没有区别。 E3的时钟频率提高了20%,因此工作速度提高了20%。我能做些什么,可能我会以某种方式使用一些特殊的Xeon E5指令?
令人讨厌的是,在真正的应用程序中,Xeon E5比Xeon E3慢2倍(!!)...(参考我的链接问题)
所以问题是 - 如何使用2 * Xeon E5配置的强大功能?我应该使用哪些技术,如何使用C#编程以使用多处理器配置的功能?
我很失望,我花了10 000美元购买服务器,执行我的程序比现有的服务器慢2倍,我买的只需1 500美元
答案 0 :(得分:1)
在我的一点经验中,任务并行库在创建正确数量的线程以最大化CPU方面做得非常出色。查看http://msdn.microsoft.com/en-us/library/dd537609.aspx
答案 1 :(得分:1)
首先:这个测试不是决定什么服务器是最好的($ 10 000或$ 1 500),因为在价格中包括几个东西,如材料的质量,电源,HD等。您的测试可以计算算术运算的数量(主要涉及处理器和内存总线)。
在我的Xeon E5410 @ 2.33GHz - 4GB RAM(虚拟机 - 4个内核)中,我得到了以下结果:
425872098
Time Elapsed: 00:05:56.9214226
但最大的错误是:服务器仅使用25%的功率(1核心)。
所以我使用Parallel Task Library并且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();
}
}
}
结果:
359930438
Time Elapsed: 00:05:01.6560249
差不多一分钟,好吧,这意味着无论你可以同时运行多少个线程,差别很小。也许缓存(L1或L2)不足以容纳一些变量并强制执行更多RAM往返,或者答案可能不在您的处理器中,而在于代码。