c# - 如何高性能地多次使用一个数组项?

标签 c# arrays performance struct compiler-optimization

对于时间关键的算法,我有一个结构数组,需要访问一个数组项的多个字段,如下所示:

    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/

相关文章:

C# 字节数组 - 有符号和无符号的困境

javascript - 通过循环的 JSON 响应

评估用户输入时代码无法继续

c# - 预编译的 ASP.NET 网站上的高波动 '% Time in JIT'

java - 对象类型转换的性能

performance - 什么 Rust 结构使用 libsystem_m 中的 nearbyint?

c# - 为什么 WPF 呈现折叠或隐藏控件?

c# - 创建一个没有文件的文件流 C#

c# - 在运行时加载模块化 ASP.NET 组件

带有 Int 数组的 Java HashMap