如何在多线程环境中模拟多个指定的计算时间?

时间:2014-09-27 20:38:30

标签: c# .net multithreading

我想在多线程环境中模拟数百个让我们说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.
        }
    }
}

0 个答案:

没有答案