アフィリエイト広告を利用しています
ファン
検索
<< 2022年05月 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
最新記事
写真ギャラリー
最新コメント
タグクラウド
カテゴリーアーカイブ
c#(2)
月別アーカイブ
プロフィール
やっくるさんの画像
やっくる
プロフィール

広告

posted by fanblog

2022年05月29日

C# 処理速度 配列 コピー Skip Take Array.Copy Buffer.BlockCopy

using System.Collections;
using System.Diagnostics;


//◆resume
//広範囲切り出ししない場合
// 参照渡しが最速
//広範囲切り出しのする場合
// skp+takeが無難(ToAry/LstせずEnumerableで扱う前提)
// len200未満ならAry.Cpy
//◆detail
//len200あたりを堺に、skp+takeの方が早くなる
//var iTime = 1,000,000;
// ----- cpy系 (参照含む) -----
//only for :0.003916810000000001

//=[20] :0.00506919
//Ary.Cpy2-18 :0.026659270000000002 // skpの2倍程速い
//Bf.BlkCpy2-18 :0.035986769999999994
//skip2-take18 :0.055729600000000004
//skip2-take18.Cnt :0.06131551999999999
//ms read2-18 :0.07749840999999999
//skip2-take18.ToAry:0.12371009
//skip2-take18.ToLst:0.12653051
//ms sr only ctor20 :0.53210541

//=[200] :0.0039536599999999995
//Ary.Cpy20-180 :0.03792715 // skpと大差なし
//Bf.BlkCpy20-180 :0.038147219999999996
//skip20-take180 :0.04647439999999999
//skip20-take180.Cnt :0.06053751
//ms read20-180 :0.06210962
//ms sr only ctor200 :0.39515325999999995
//skip20-take180.ToLst:0.53726021
//skip20-take180.ToAry:0.58260523

//=[2000] :0.004071860000000001
//skip200-take1800 :0.04412279 // 次点のCpyの5倍程速い
//skip200-take1800.Cnt :0.05719957
//Bf.BlkCpy200-1800 :0.22781015
//Ary.Cpy200-1800 :0.23208406999999998
//ms read200-1800 :0.25393420000000005
//ms sr only ctor2000 :0.38667927
//skip200-take1800.ToLst:4.3359177099999995
//skip200-take1800.ToAry:4.411541120000001

//=[20000] :0.00409403
//skip2000-take18000 :0.04361117 // 次点のCpyの50倍程速い
//skip2000-take18000.Cnt:0.055852250000000006
//ms sr only ctor20000 :0.42708772999999994
//Bf.BlkCpy2000-18000 :2.0283845
//Ary.Cpy2000-18000 :2.1328456
//ms read2000-18000 :2.22134107

var jTime = 10;
var iTime = 1_000_000;
Console.WriteLine($"var iTime = {iTime.ToString("#,##0")};");
Stopwatch sw;
var swList = new List();
var swAveDic = new Dictionary();

Action> 計測 = (procName, loopAct) =>
{
//Console.WriteLine(procName);
swList.Clear();
for (var j = 0; j < jTime; j++)
{
sw = Stopwatch.StartNew();
for (var i = 0; i < iTime; i++)
loopAct(i);
sw.Stop();
swList.Add(sw.Elapsed.TotalSeconds);
//Console.WriteLine($"{procName}:{sw.Elapsed.TotalSeconds}");
}
swAveDic[procName] = swList.Average();
};

計測("only for", (i) => { });

Console.WriteLine($"\n ----- cpy系 (参照含む) -----");
for (var srcLen = 20; srcLen <= 20000; srcLen *= 10)
{
int cpySta = srcLen / 10;
int cpyLen = srcLen / 10 * 9;
var byAry = Enumerable.Range(0, srcLen).Select(x => (byte)x).ToArray();
計測($"=[{srcLen}]", (i) => { var byAry2 = byAry; });
計測($"skip{cpySta}-take{cpyLen}", (i) => { var byAry2 = byAry.Skip(cpySta).Take(cpyLen); });
計測($"skip{cpySta}-take{cpyLen}.Cnt", (i) => { var byAry2 = byAry.Skip(cpySta).Take(cpyLen).Count(); });
if (cpyLen <= 5000)//万でやるとかなり重い
{
計測($"skip{cpySta}-take{cpyLen}.ToAry", (i) => { var byAry2 = byAry.Skip(cpySta).Take(cpyLen).ToArray(); });
計測($"skip{cpySta}-take{cpyLen}.ToLst", (i) => { var byAry2 = byAry.Skip(cpySta).Take(cpyLen).ToArray(); });
}
計測($"Ary.Cpy{cpySta}-{cpyLen}", (i) => {
var byAry2 = new byte[cpyLen];
Array.Copy(byAry, cpySta, byAry2, 0, cpyLen);
});
計測($"Bf.BlkCpy{cpySta}-{cpyLen}", (i) => {
var byAry2 = new byte[cpyLen];
Buffer.BlockCopy(byAry, cpySta, byAry2, 0, cpyLen);
});
計測($"ms read{cpySta}-{cpyLen}", (i) => {
using var ms = new MemoryStream(byAry);
var byAry2 = new byte[cpyLen];
ms.Position = cpySta;
ms.Read(byAry2, 0/*書かれる側の開始位置*/, cpyLen);
});
計測($"ms sr only ctor{srcLen}", (i) => {
using var ms = new MemoryStream(byAry);
using var sr = new StreamReader(ms);
});
//Console.WriteLine($"\n ----- orderBy fast > cpy系 -----");
Console.WriteLine($"");
var keyLenMax = swAveDic.Keys.Max(x => x.Length);
foreach (var kv in swAveDic.OrderBy(x => x.Value))
Console.WriteLine($"{kv.Key.PadRight(keyLenMax)}:{kv.Value}");
swAveDic.Clear();
}

var procName = "オマケ◆only for, without Action";
Console.WriteLine($"\n ----- {procName} -----");
for (var j = 0; j < jTime; j++)
{
sw = Stopwatch.StartNew();
for (var i = 0; i < iTime; i++)
;
sw.Stop();
Console.WriteLine($"{procName}:{sw.Elapsed.TotalSeconds}");
}
【このカテゴリーの最新記事】
posted by やっくる at 00:59| Comment(0) | TrackBack(0) | c#
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/11429544
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
×

この広告は30日以上新しい記事の更新がないブログに表示されております。