昨天我解决了一个考试问题,当发现一些非常有趣的东西时(至少对我而言).该程序用于阶乘(非常大),结果是数字末尾有多少个零(在某些情况下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)
我很抱歉如果这是一个错误的地方,我会在发布之前尽力找到我要找的东西.
我立即注意到你的代码的事情是你Console.WriteLine()在计算循环中包含了语句.
事实是,I/O是多少慢一台计算机处理比计算,即使在理想的条件.我不会说Windows控制台窗口是特定类型的I/O的特别有效的实现.此外,I/O往往较少依赖于机器之间的CPU和内存差异.
换句话说,我很可能主要测量I/O吞吐量而不是计算吞吐量,因此在机器之间看到一致的结果并不奇怪.
对于它的价值,当我在笔记本电脑上运行你的例子时,如果我禁用输出,我可以在大约一分钟内完成计算.如果我按原样使用代码,我会更接近你的1:30时间.
编辑:
我也推荐Hans Passant的答案.内存I/O仍然是I/O,正如我上面所描述的那样,机器之间的变化远不如CPU速度.我希望上面的通用描述可以提供差异所在的想法(无法访问每个有问题的机器,没有任何方法可以确定原因是什么),但Hans的答案提供了一些非常好的解释.关于内存I/O问题的详细信息,非常值得一读.
发生的情况是,电脑的核心或处理器具有固定大小的内部总线,用于存储数据。RAM的速度比处理器慢10-1000倍。还有一种叫做高速缓存的东西,但是高速缓存的大小很小。那么你的电脑有多大的内存,它仍然会很慢并且需要时间。因为当它达到高数字时,数字需要时间来读取和写入内存。
另外,每次向屏幕写入都会占用一些时间。