为什么使用IEnumerator的操作比遍历每个数组要快?
本文关键字:数组 遍历 IEnumerator 操作 为什么 | 更新日期: 2023-09-27 18:14:50
//示例程序将字符串反向打印,尝试两种方法。
class Program
{
static void Main(string[] args)
{
//Message string used for reverse operation
String messageText = " I am human trying to learn programming";
String[] sep= {" "};
//reversing the string using split and accessing the array in reverse order
string[] splitedString = messageText.Split(sep, StringSplitOptions.None);
//used to measure the time taken by operation1
DateTime timer = DateTime.Now;
for (int index = 0; index < splitedString.Length; index++ )
{
Console.Write("{0} ", splitedString[index]);
}
Console.WriteLine("The time taken is {0}", (DateTime.Now - timer).TotalMilliseconds);
//used to measure the time taken by operation2
timer = DateTime.Now;
//reversing the string using in build reverse method and later emumerating though each element using
//for each
IEnumerable<String> rev = splitedString.ToList<string>();
foreach (string individualText in rev)
Console.Write("{0} ",individualText);
Console.WriteLine("The time taken is {0}", (DateTime.Now - timer).TotalMilliseconds);
Console.ReadLine();
}
}
//抱歉,之前的代码将split函数放在了错误的位置。很抱歉提交了错误的代码//只是想理解为什么IEnumerable更快
几乎可以肯定,您正在看到CPU缓存的效果:在开始时,数据和代码(包括框架代码)没有缓存,作为第一次操作的一部分,它被复制到缓存中。因此,第一次操作的时间包含了更慢的内存访问。
为了有效地计算微操作的时间,您需要循环数千次迭代,并避免潜在的高开销操作(如IO),这些操作可能会占用您想要的时间(IO可能比纯CPU操作长许多个数量级)。
但是:这两种类型的操作之间的差异极不可能是显著的:更多的程序工作,2。使其易于维护;看看是否达到了绩效目标。只有当3的答案是"否"时,你才可以开始分析和衡量事情进展缓慢的地方。