gpt4 book ai didi

.net - 将字节数组转换为 int 的更快方法

转载 作者:行者123 更新时间:2023-12-03 18:08:03 25 4
gpt4 key购买 nike

有没有比 BitConverter.ToInt32 更快的方法将字节数组转换为 int 值?

最佳答案

我实际上尝试了几种不同的方法将四个字节转换为 int:

  • BitConverter.ToInt32(new byte[] { w, x, y, z }, 0);
  • BitConverter.ToUInt32(new byte[] { w, x, y, z }, 0);
  • b = new byte[] { w, x, y, z };
    BitConverter.ToInt32(b, 0);
  • b = new byte[] { 1, 2, 3, 4, 5, 6, 7, w, x, y, z };
    BitConverter.ToInt32(b, 7);
  • w | (x << 8) | (y << 16) | (z << 24);
  • b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);

  • 我在 Release (x86) 版本中运行了每个版本的 10^9 次迭代,而不是在 2.5 GHz 的调试器下运行 Core i7笔记本电脑。这是我的结果(请注意,不使用 BitConverter 的方法要快得多):
    test1: 00:00:15.5287282 67305985
    test2: 00:00:15.1334457 67305985
    test3: 00:00:08.0648586 67305985
    test4: 00:00:11.2307059 67305985
    test5: 00:00:02.0219417 67305985
    test6: 00:00:01.6275684 67305985

    你可以得出一些结论:
  • test1 显示在我的笔记本电脑上很难让转换速度低于 15ns,我不想说这对任何人来说都足够快。 (是否需要每秒调用超过 60M 次?)
  • test2 显示使用 uint而不是 int节省少量时间。我不知道为什么,但我认为它小到足以成为实验错误。
  • test3 显示创建一个新的字节数组 (7ns) 的开销几乎与调用函数一样多,但仍然比从旧数组中创建一个新数组要快。
  • test4 显示从 ToInt32 进行未对齐的数组访问增加开销 (3ns)
  • test5 表明从局部变量中提取 4 个字节并自己组合它们比调用 ToInt32 快几倍。 .
  • test6 表明从数组中提取 4 个字节实际上比从函数参数中提取要快一些!我怀疑这是由于 CPU 流水线或缓存效应造成的。

  • 最快的 test6 运行时间仅为空循环(未显示)的两倍。换句话说,执行每次转换所需的时间不到 1ns。祝你好运,让任何有用的计算都比这更快!

    这是我的测试程序:
    using System;

    namespace BitConverterTest
    {
    class Program
    {
    const int iters = 1000000000;
    static void Main(string[] args)
    {
    test1(1, 2, 3, 4);
    test2(1, 2, 3, 4);
    test3(1, 2, 3, 4);
    test4(1, 2, 3, 4);
    test5(1, 2, 3, 4);
    test6(1, 2, 3, 4);
    }

    static void test1(byte w, byte x, byte y, byte z)
    {
    int res = 0;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    for (int i = 0; i < iters; i++)
    res = BitConverter.ToInt32(new byte[] { w, x, y, z }, 0);
    Console.WriteLine("test1: " + timer.Elapsed + " " + res);
    }

    static void test2(byte w, byte x, byte y, byte z)
    {
    uint res = 0;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    for (int i = 0; i < iters; i++)
    res = BitConverter.ToUInt32(new byte[] { w, x, y, z }, 0);
    Console.WriteLine("test2: " + timer.Elapsed + " " + res);
    }

    static void test3(byte w, byte x, byte y, byte z)
    {
    int res = 0;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    var b = new byte[] { w, x, y, z };
    for (int i = 0; i < iters; i++)
    res = BitConverter.ToInt32(b, 0);
    Console.WriteLine("test3: " + timer.Elapsed + " " + res);
    }

    static void test4(byte w, byte x, byte y, byte z)
    {
    int res = 0;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    var b = new byte[] { 1, 2, 3, 4, 5, 6, 7, w, x, y, z };
    for (int i = 0; i < iters; i++)
    res = BitConverter.ToInt32(b, 7);
    Console.WriteLine("test4: " + timer.Elapsed + " " + res);
    }

    static void test5(byte w, byte x, byte y, byte z)
    {
    int res = 0;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    var b = new byte[] { w, x, y, z };
    for (int i = 0; i < iters; i++)
    res = w | (x << 8) | (y << 16) | (z << 24);
    Console.WriteLine("test5: " + timer.Elapsed + " " + res);
    }

    static void test6(byte w, byte x, byte y, byte z)
    {
    int res = 0;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    var b = new byte[] { w, x, y, z };
    for (int i = 0; i < iters; i++)
    res = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
    Console.WriteLine("test6: " + timer.Elapsed + " " + res);
    }
    }
    }

    关于.net - 将字节数组转换为 int 的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4326125/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com