c# – 使用大整数时的CPU和/或RAM生产率

前端之家收集整理的这篇文章主要介绍了c# – 使用大整数时的CPU和/或RAM生产率前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
昨天我解决了一个考试问题,当发现一些非常有趣的东西时(至少对我而言).该程序用于阶乘(非常大),结果是数字末尾有多少个零(在某些情况下为2500个零).所以我尽我所能,但发现当输入数字如100 000时,它只需1; 30 – 1; 33分钟输出结果.我认为这是因为我的cpu(它不是很快).我已经将.exe发送给我的一些朋友尝试了,因为当我们讨论性能时它们有非常好的PC – 完全相同的结果(1; 33分钟).

我的问题是为什么解决任务的时间是一样的.我知道有更好的方法来编写我的核心所以不会花这么长时间,但这对我来说非常重要,因为我作为初学者程序员可以理解.
所以这是我的代码

static void Main()
        {
            int num = int.Parse(Console.ReadLine()),zeroCounter = 0;
            BigInteger fact = 1;
            var startTime = DateTime.Now;

            Console.WriteLine();

            for (int i = 1; i <= num; i++)
            {
                fact *= i;
                Console.Write("\r{0}",DateTime.Now - startTime);
            }
            BigInteger factTarget = fact;
            while (factTarget % 10 == 0)
            {
                factTarget /= 10;
                zeroCounter++;
                Console.Write("\r{0}",DateTime.Now - startTime);
            }
            Console.WriteLine();
            Console.WriteLine("Result is number with {0} zeros.",zeroCounter);
            Console.WriteLine();
            Console.WriteLine("Finished for: {0}",DateTime.Now - startTime);
            Console.WriteLine();
            Console.WriteLine("\nPres any key to exit...");
            Console.ReadKey();
        }

我很抱歉如果这是一个错误的地方,我会在发布之前尽力找到我要找的东西.

解决方法

我立即注意到你的代码的事情是你在计算循环中包含了Console.WriteLine()语句.

事实上,即使在理想条件下,I / O对计算机的处理要比计算慢得多.我不会说Windows控制台窗口是特定类型的I / O的特别有效的实现.此外,I / O往往较少依赖于机器之间的cpu和内存差异.

换句话说,我很可能主要测量I / O吞吐量而不是计算吞吐量,因此在机器之间看到一致的结果并不奇怪.

对于它的价值,当我在笔记本电脑上运行你的例子时,如果我禁用输出,我可以在大约一分钟内完成计算.如果我按原样使用代码,我会更接近你的1:30时间.

编辑:我也推荐Hans Passant的答案.内存I / O仍然是I / O,正如我上面所描述的那样,机器之间的变化远不如cpu速度.我希望上面的通用描述可以提供差异所在的想法(无法访问每个有问题的机器,没有任何方法可以确定原因是什么),但Hans的答案提供了一些非常好的解释.关于内存I / O问题的详细信息,非常值得一读.

猜你在找的C#相关文章