如何加快 IEnumerator 的 foreach 循环
How to speed up foreach loop for IEnumerator
背景不多
我正在尝试使用 Intersystems IRIS Api
万一你想看呢。
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BNETNAT_refapi#BNETNAT_refapi_iris-iterator
所以基本上我有这样的东西(不是实际代码)
string global = "myGlobal";
object subs = new object[2];
subs[0]="node1";
subs[1]="node2";
IRISIterator iter = iris.GetIRISIterator(global, subs); //Returns IEnumerator
foreach(var item in iter)
{
//for simplicity just printing it, actual code will process the data
Console.WriteLine(iter.CurrentSubscript.ToString());
}
运行速度很慢,读取50条记录需要将近4秒。
所以我的问题是,鉴于我对 GetIRISIterator 没有任何控制权,是否有可能提高上述代码的性能?
我可以进行某种类型的并行处理或异步执行以减少时间吗?
每次调用.MoveNext()
方法前进到下一项时,迭代器可能会做一些缓慢的操作。这可能是由于访问某些外部系统(例如数据库)的开销造成的,并且每个项目都有可能产生这种开销。
所以我首先要尝试的是不使用 GetIRISIterator
,似乎有 GetIRISList
而不是 returns 列表。有可能这对完整列表只承受一次开销。
并行处理不太可能改进任何东西,因为需要时间的是项目的获取,而不是项目的处理。
异步执行不会减少所花费的时间,但它可以通过向用户表明系统正在处理请求而不仅仅是挂起来改善用户体验。
每当讨论性能时,我都会建议进行适当的测量。使用性能分析器可能会非常有用,因为它可以告诉您大部分时间花在了哪里。
背景不多
我正在尝试使用 Intersystems IRIS Api 万一你想看呢。 https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BNETNAT_refapi#BNETNAT_refapi_iris-iterator
所以基本上我有这样的东西(不是实际代码)
string global = "myGlobal";
object subs = new object[2];
subs[0]="node1";
subs[1]="node2";
IRISIterator iter = iris.GetIRISIterator(global, subs); //Returns IEnumerator
foreach(var item in iter)
{
//for simplicity just printing it, actual code will process the data
Console.WriteLine(iter.CurrentSubscript.ToString());
}
运行速度很慢,读取50条记录需要将近4秒。 所以我的问题是,鉴于我对 GetIRISIterator 没有任何控制权,是否有可能提高上述代码的性能? 我可以进行某种类型的并行处理或异步执行以减少时间吗?
每次调用.MoveNext()
方法前进到下一项时,迭代器可能会做一些缓慢的操作。这可能是由于访问某些外部系统(例如数据库)的开销造成的,并且每个项目都有可能产生这种开销。
所以我首先要尝试的是不使用 GetIRISIterator
,似乎有 GetIRISList
而不是 returns 列表。有可能这对完整列表只承受一次开销。
并行处理不太可能改进任何东西,因为需要时间的是项目的获取,而不是项目的处理。
异步执行不会减少所花费的时间,但它可以通过向用户表明系统正在处理请求而不仅仅是挂起来改善用户体验。
每当讨论性能时,我都会建议进行适当的测量。使用性能分析器可能会非常有用,因为它可以告诉您大部分时间花在了哪里。