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

Kad*_*ski 6 c# cpu

昨天我解决了一个考试问题,当发现一些非常有趣的东西时(至少对我而言).该程序用于阶乘(非常大),结果是数字末尾有多少个零(在某些情况下2500为零).所以我做了我所能做的,但发现时输入数字,如100 000它恰恰1;30 - 1;33min输出结果.我认为这是因为我的CPU(它不是很快).我已经将.exe发送给我的一些朋友尝试了,因为当我们谈论性能时他们有非常好的PC - 完全相同的结果(1;33min).

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

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();
        }
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*iho 5

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

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

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

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


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


Sha*_*Ag. 0

发生的情况是,电脑的核心或处理器具有固定大小的内部总线,用于存储数据。RAM的速度比处理器慢10-1000倍。还有一种叫做高速缓存的东西,但是高速缓存的大小很小。那么你的电脑有多大的内存,它仍然会很慢并且需要时间。因为当它达到高数字时,数字需要时间来读取和写入内存。

另外,每次向屏幕写入都会占用一些时间。