バイト配列の部分コピーの速度のおはなし
9230 ワード
過去皆さん書いてることだけどね。
わかってることだけど速さ必要なところでサボってlinqで書いちゃいけないよってね(;・∀・)
class Program
{
const int COUNT = 1000000;
static void Main(string[] args)
{
var basearray = Enumerable.Range(0, 1024).Select(x => (byte) x).ToArray();
var sw = Stopwatch.StartNew();
for (var i = 0; i < COUNT; i++)
{
var buffer = basearray.Skip(20).Take(20).ToArray();
}
sw.Stop();
Console.WriteLine($"linq {sw.ElapsedMilliseconds}ms");
sw = Stopwatch.StartNew();
for (var i = 0; i < COUNT; i++)
{
var buffer = new byte[20];
Array.Copy(basearray, 20, buffer, 0, 20);
}
sw.Stop();
Console.WriteLine($"ArrayCopy {sw.ElapsedMilliseconds}ms");
sw = Stopwatch.StartNew();
for (var i = 0; i < COUNT; i++)
{
var buffer = new byte[20];
Buffer.BlockCopy(basearray, 20, buffer, 0, 20);
}
sw.Stop();
Console.WriteLine($"BlockCopy {sw.ElapsedMilliseconds}ms");
sw = Stopwatch.StartNew();
var ptr = Marshal.AllocCoTaskMem(basearray.Length);
Marshal.Copy(basearray, 0, ptr, basearray.Length);
try
{
for (var i = 0; i < COUNT; i++)
{
var buffer = new byte[20];
Marshal.Copy(ptr + 20, buffer, 0, 20);
}
}
finally
{
Marshal.FreeCoTaskMem(ptr);
}
sw.Stop();
Console.WriteLine($"marshal {sw.ElapsedMilliseconds}ms");
Console.ReadKey();
}
linq 1622ms
ArrayCopy 71ms
BlockCopy 55ms
marshal 62ms
Author And Source
この問題について(バイト配列の部分コピーの速度のおはなし), 我々は、より多くの情報をここで見つけました https://qiita.com/yu_ka1984/items/c97e0950486e3ecc5642著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .