Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算密集型C#程序没有好处?_C#_Multithreading_Visual Studio 2010 - Fatal编程技术网

计算密集型C#程序没有好处?

计算密集型C#程序没有好处?,c#,multithreading,visual-studio-2010,C#,Multithreading,Visual Studio 2010,我试图看到以下两个程序(预期)之间的性能差异。但是我发现没有什么不同。这正常吗?我在Windows Core 2 Duo M/C上运行 VisualStudio2010快速版 程序1(平均运行100次以上:824.11毫秒): 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用系统诊断; 使用系统线程; 命名空间多线程 { 班级计划 { 公共静态秒表; 静态void Main(字符串[]参数) { 秒表=新秒表(); 秒表。

我试图看到以下两个程序(预期)之间的性能差异。但是我发现没有什么不同。这正常吗?我在Windows Core 2 Duo M/C上运行 VisualStudio2010快速版

程序1(平均运行100次以上:824.11毫秒):

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统诊断;
使用系统线程;
命名空间多线程
{
班级计划
{
公共静态秒表;
静态void Main(字符串[]参数)
{
秒表=新秒表();
秒表。开始();
//线程t=新线程(WriteY);
//t、 Start();
对于(int i=0;i<10000;i++)
{
Console.Write(“x{0}”,i);
}
WriteY();
WriteLine(“以毫秒为单位的时间:{0}”,stopwatch.elapsedmillesons);
Console.ReadLine();
}
静态void WriteY()
{
对于(int i=0;i<10000;i++)
{
Console.Write(“y{0}”,i);
}
//WriteLine(“以毫秒为单位的时间:{0}”,stopwatch.elapsedmillesons);
//Console.ReadLine();
}
程序2(平均运行100次以上:828.11 ms):

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统诊断;
使用系统线程;
命名空间多线程
{
班级计划
{
公共静态秒表;
静态void Main(字符串[]参数)
{
秒表=新秒表();
秒表。开始();
线程t=新线程(WriteY);
t、 Start();
对于(int i=0;i<10000;i++)
{
Console.Write(“x{0}”,i);
}
//WriteY();
WriteLine(“以毫秒为单位的时间:{0}”,stopwatch.elapsedmillesons);
Console.ReadLine();
}
静态void WriteY()
{
对于(int i=0;i<10000;i++)
{
Console.Write(“y{0}”,i);
}
//WriteLine(“以毫秒为单位的时间:{0}”,stopwatch.elapsedmillesons);
//Console.ReadLine();
}
}
}

我的猜测是,两者都受到
控制台速度的限制。编写
可能需要锁定资源(屏幕)因此一次只有一个线程访问它。

问题是,您的应用程序是IO绑定的,因为您一直使用
控制台.WriteLine
。如果您做了一些不使用IO的事情,您将看到一个提升


正如在另一个答案中提到的,WriteLine确实是同步的:

-1.你没有任何计算,所以“计算密集”这是一个基本的误解。Isntead您所做的就是Console.WriteLine IO,它由Console输出机制序列化。确切地说。不同线程的字符串彼此没有冲突是显而易见的。如果没有
控制台。WriteLine
程序几乎肯定会完成(接近)同时,在第二个示例中,在旋转线程上花费了更多的开销。我希望第一个线程首先完成。当然,如果没有循环体,编译器可能会完全忽略循环(在发布模式下),使之成为旋转线程与不旋转线程的衡量标准。@spender是的,这完全取决于
WriteLine
被什么所取代。如果它被什么所取代,正如你所说,它可能被什么所取代。但是如果它被一个大的矩阵乘法所取代,那么它们的运行时间可能会减少近50%(取决于缓存等)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;


namespace MultiThreading
{
    class Program
    {
        public static Stopwatch stopwatch;
        static void Main(string[] args)
        {
            stopwatch = new Stopwatch();
            stopwatch.Start();
            //Thread t = new Thread(WriteY);
            //t.Start();
            for (int i = 0; i < 10000; i++)
            {
                Console.Write("x{0} ", i);
            }

            WriteY();

            Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds);
            Console.ReadLine();
        }

        static void WriteY()
        {
            for (int i = 0; i < 10000; i++)
            {
                Console.Write("y{0} ", i);
            }
            //Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds);
            //Console.ReadLine();
        }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;


namespace MultiThreading
{
    class Program
    {
        public static Stopwatch stopwatch;
        static void Main(string[] args)
        {
            stopwatch = new Stopwatch();
            stopwatch.Start();
            Thread t = new Thread(WriteY);
            t.Start();
            for (int i = 0; i < 10000; i++)
            {
                Console.Write("x{0} ", i);
            }

            //WriteY();

            Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds);
            Console.ReadLine();
        }

        static void WriteY()
        {
            for (int i = 0; i < 10000; i++)
            {
                Console.Write("y{0} ", i);
            }
            //Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds);
            //Console.ReadLine();
        }
    }
}