对于时间关键的算法,我有一个结构数组,需要访问一个数组项的多个字段,如下所示:
struct MyStruct
{
public int a, b, c;
}
MyStruct[] MyArray = new MyStruct[5];
int Test(int id)
{
return MyArray[id].a + MyArray[id].b + MyArray[id].c;
}
这是否已被编译器优化,因此无法变得更快?
即使是这样,它的可读性也不是很好。
它会变得更具可读性,如下所示:
int Test(int id)
{
var item = MyArray[id];
return item.a + item.b + item.c;
}
但是,由于它是一个结构体,因此它会被复制,对吗?这很糟糕。
我可以做到这一点并希望它被内联:
int Test(ref MyStruct item)
{
return item.a + item.b + item.c;
}
int Test(int id)
{
return Test(ref MyArray[id]);
}
下一个想法是使用不安全指针,那么我可以这样做
//fixed statement, forgot syntax
return item->a + item->b + item->c;
有什么建议吗?如何正确地做到这一点?
据我所知,其他语言有一个 with
block - 像这样的东西 - 这不是很好吗(在这种情况下 - 最好不要讨论这个)?
with MyArray[id] do
return a + b + c;
最佳答案
“对于时间关键型算法”,所有代码样式变体都是无关紧要的 - 唯一关键考虑因素是时间。如果您可以首先优化逻辑并降低大 O 时间复杂度(平均或最差),然后优化实现性能,并且仅如果您在多个实现之间陷入僵局,那么您会做得很好拥有最干净代码的一个。
为了获得最优化的实现,请考虑使用低级代码(“不安全代码”)并分析您的所有想法,直到您知道什么最有效。
关于c# - 如何高性能地多次使用一个数组项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816024/