我想在多线程环境中模拟数百个让我们说100毫秒的计算。
假设四核处理器(i5-3570K)上的400毫秒400计算应该花费10秒。 (400/4)* 100ms。
第一次尝试当然是Thread.Sleep(100),但在多线程环境中,这为其他线程提供了完成工作的机会(这只是在休眠)。但我想让处理器忙碌100ms,没有这个机会。
第二次尝试是在进行睡眠之前锁定当前线程,但这似乎也不起作用。计算时间仍然只有3秒。
我已经创建了一个测试类来模拟这个,但显然我需要比当前线程上的锁更好的东西,而且我还想指定计算时间。有什么建议?我可以期待不同锁定机制的预期结果吗?
或者我应该有不同的期望吗? CPU利用率很低,但我不介意/没想到。
这是我用作原型的单元测试类的源代码。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace CalculationTimeSimulator
{
[TestClass]
public class CalculationTimeTests
{
public int CalculateMeaningOfTheUniverse()
{
var thread = Thread.CurrentThread;
lock (thread)
{
Thread.Sleep(100);
}
return 42;
}
[TestMethod]
public void SubtleDouglasAdamsReferenceTest()
{
var theAnswerTo = CalculateMeaningOfTheUniverse();
Assert.AreEqual(42, theAnswerTo);
// Takes 103 ms, as expected with small overhead.
}
[TestMethod]
public void TryIt400Times()
{
var items = Enumerable.Range(1, 400);
Parallel.ForEach<int>(items, item =>
{
var theAnswerTo = CalculateMeaningOfTheUniverse();
Assert.AreEqual(42, theAnswerTo);
});
// Took 3 sec, but I expected 10 sec on quad core processor.
}
}
}