我正在制作一个程序,通过将给定半径的多边形的边数增加到一个非常高的数字来估计pi,取出该区域,并将其除以半径的平方.我有以下内容:
double radius = 5;
for (double sides = 3;sides < 10000;sides++)
{
double pi_est = ((radius * radius * sides * Math.Sin((360 / sides)*(Math.PI/180))) / 2) / (radius * radius);
richTextBox1.AppendText(pi_est+"\n");
}
Run Code Online (Sandbox Code Playgroud)
截至目前,这需要大约5秒钟才能完成.有什么我可以写的,可以提高我的循环效率吗?
该AppendText调用将花费大量时间,因为它意味着访问UI.使用a StringBuilder或数组String.Join来累积字符串.
你永远不应该使用a double作为迭代变量; 使用一个int代替(这不是一个效率问题和更多的潜在问题).
radius*radius取消 - 请注意,这pi与所使用的半径无关,因此您可以假设半径等于1并忽略它.
全部写出:
StringBuilder sb = new StringBuilder();
for(int sides = 3; sides < 10000; sides++) {
double pi_est = sides * Math.Sin((2*Math.PI)/sides) / 2;
sb.append(pi_est + "\n");
}
richTextBox1.AppendText(sb.ToString());
Run Code Online (Sandbox Code Playgroud)
对于初学者,您可以预先计算循环外的半径*半径.
此外,如果不需要循环内更新您的丰富的文本框,一旦外循环,只是使用StringBuilder内.