我有一个专有的COM库,它返回一个整数数组(当然是使用其自己的专有格式)。当我从主UI线程访问这个数组时,一切都很好,并且运行速度很快。但是,如果我从另一个线程访问它,访问速度会非常慢。下面是一些示例代码。
private void test() {
ProprietaryLib.Integers ints = ProprietaryLib.GetInts();
int x;
for(int i = 0; i < 500; i++)
for(int j = 0; j < ints.Count; j++)
x = ints[j];
}
private void button1_Click(object sender, EventArgs e) {
test(); // Very little time
new System.Threading.Thread(() => test()).Start(); // Lots of time
}
为什么会出现这种情况?有没有办法加速?如果我使用多进程而不是多线程,那么能否希望获得更好的性能?(但听起来好像更复杂了。)
更新:
我对以下答案感到满意,但想在此添加一些数据以供参考(我的和其他人的)。
如上所示,在新线程中创建和访问对象每次需要大约12ns。假定对象实际上是在主线程上创建的,因此速度较慢是由于从主线程进行数据传递。
如果你在主线程上明确地创建数据,但在标记为单线程公寓的新线程中访问它,则访问时间会更慢,每次访问需要15纳秒。我猜.NET必须有一些额外的开销来保持公寓的美观,虽然我不知道那个开销是什么,只有2-3ns的差异,但它也不需要太多。
如果你在标记为STA的新线程上创建和访问对象,则时间会以每次0.2ns的速度消失。但是这个新线程真的安全吗?这是另一个问题的问题。