不同类型的数组

时间:2015-08-07 21:24:00

标签: c# arrays performance memcpy

如您所知,Array.Copy比将数组内容手动复制到另一个数组更快,因为它可以从一个位置直接复制到另一个位置。

但是,我要说我有short[]char[]。您不能在Array.Copy之间进行sizeof(short) == sizeof(char)因为它们的类型不同,但其中的元素大小相同,memcpy 。如何在不执行for循环的情况下绕过类型限制以从short[]char[]执行reinterpret_cast<>?我在谈论与C ++中memcpy逻辑等价的东西。

TL; DR:如果两个数组具有相同大小的元素,您可以操纵它以更快地复制它们之间的元素吗?你总是可以有一个for循环,但是我正在寻找一个更像是从一个数组到另一个数组的直接/** * Check youtube url, check video exists or not, * * @param $url full youtube video url * * @return string - yotube video id */ public static function checkYoutube($url) { if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) { $headers = get_headers('http://gdata.youtube.com/feeds/api/videos/' . $match[1]); if (strpos($headers[0], '200')) { return $match[1]; } return false; } return false; } 的东西。

此外,我还想再次注意 for循环将不被接受。我很清楚它们,但这是一个性能问题,询问是否还有更多有效的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以使用Buffer.BlockCopy。与Array.Copy不同,它将数组的基础字节复制到目标。例如,short由2个字节组成。 5的空short[]可能如下所示:

                 1 short (0x0000)
                        ˅˅˅˅
    0000 0000 0000 0000 0000
         ^^          ^^
    1 byte (0x00)  Byte #8 (byte index 7)

与此同时,假设我们有一个byte[],这次有10个指数。它看起来像这样:

                             Last byte [9]
                                   ˅˅
        AF C0 24 19 05 67 F9 D7 24 B3
        ^^
    First byte [0]

现在,请注意这些数组的大小完全相同:short[]是5 x 2字节,而byte[]是10 x 1.所以如果我们运行Buffer.BlockCopy(bytes, 0, shorts, 0, bytes.Length),这基本上将字节从bytes复制到shorts,短路将成为:

AFC0 2419 0567 F9D7 24B3

所以是的,这实质上就是Buffer.BlockCopy所做的 - 它复制了数组的底层字节。

一些提示:

  • 使用较小尺寸元素的数组来获取计数。例如,如果我使用shorts.Length作为上例中的最后一个参数,我将不得不将其乘以sizeof(short),否则它只会复制一半数组。

  • BlockCopy不适用于基元。