我有一个专有的 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 ns。我想.NET 必须有一些额外的开销来保持公寓的美观,尽管我担心我不知道开销是什么。虽然只有 2-3 ns 的差异,但它不必太大。
如果您在标记为 STA 的新线程上创建和访问对象,则每次访问的时间都会消失 0.2ns。但是这个新线程真的安全吗?这是我认为的另一个问题的问题。