見出し画像

C# 処理の高速化(速度改善ポイント)

お久しぶりです。

長い長い研修期間を経て、無事にフロントエンドのエンジニアになりまして半年が経ちました。


今回はC#の処理速度を上げるために、私が最近行っていることについて
メモ程度にまとめてみました。
当たり前のような内容もあるかとは思いますが、大目に見てください。

正直、私から見て可読性はどうなんだと思うところもありますが、
速度アップのためだということで一旦無視します。


余分なLinqを使用している場合は削除  

hoge.Select(x => x.isHoge ).Select(x => x.ProductId != 0).ToList();  

↓  

hoge.Select(x => x.isHoge && x.ProductId != 0).ToList(); 

上記のようにselect文が連続している場合は上記のようにまとめると、
わずかではあるが改善がみられた。

また、特にしなくてもよいToList()ToArray()を削除すると、
わずかではあるが改善がみられた。


Listの並べ替えを行う際はLinqをできるだけ使わない

昇順の場合

var hoge = hogeList.OrderBy().ToList(); 
var hoge2 = hogeList.OrderBy(x => x.id).ToList(); 

hogeList.Sort(); 
hogeList.Sort((x, y) => x.id.CompareTo(y.id)); 

降順の場合

var hoge = hogeList.OrderByDescending().ToList(); 
var hoge2 = hogeList.OrderByDescending(x => x.id).ToList(); 

hogeList.Sort().Reverse(); 
hogeList.Sort((x, y) => y.id.CompareTo(x.id)); 

Linqでの並べ替えは速度が遅いので、詳細にソート順を指定したい場合やListの中身がObjectである場合でない限り、Sort()を使用することをおすすめします。

取得済みの情報を再度取りに行っている場合は省略する

当たり前なように思えるのですが、意外と「あれ、これまた取りに行ってるな」という部分が潜んでいる場合があります。 (情報の整合性のチェックのために取りに行っている場合もあるので、絶対に省略してとは言えませんが…)
できるだけ、無駄なやりとりはしないようにしましょう。

文字列の結合の方法を変えてみる

var hoge = "abc"; 
hoge += "de"; // abcde 

var hoge = new StringBuilder("abc"); 
hoge.Append("de"); //abcde 

文字列の結合の際は、StringBuilderを使用したほうが圧倒的に速いです。
「圧倒的に」がどれくらいかというと、同じ内容の処理を10万回for文で回した結果「+=」で結合させた場合だとAppendで結合させた場合の処理時間の倍近く処理に時間がかかっていました。
つきましては、処理数が多ければ多いほどStringBuilderを使用したほうがよいです。

配列はforeach、Listはfor

私はてっきり逆だと思っていたのですが、調べて、「ほんとか??」と思って実際測定してみるとこっちでした。
2~3倍も違ったので、こんなに変わるのかと驚きました。

また、for文を使用する方が基本的に速いみたいですが、条件によってはforeachの方が速くなるらしいです。

IEnumerableはどっちなのか明確に測定していませんが、私の感覚的にforeachの方が処理が速かったと思います。

まとめ

今回はC#での速度改善ポイントについてまとめてみました。

どうして速くなるのかという詳しい理由を書くまで私が理解に達していなかったので説明は省きましたが、私が書かずとも既にある情報なのでこの記事をヒントに調べてみてください。

仕事で担当のサイトの速度改善に取り組んでいるなかで、処理速度はあげたいけど可読性は落としなくないし、フロントエンドだけの話でもないこともあるので頭を抱えることも多いです。
奇跡的に速くなれ!!!と思いながらやっているので、周りの方には本当に申し訳ない……

もっとこうしたほうがいいよ、これも速くなるポイントだよ
ということがあれば優しく子供に教えるようにコメントで教えてもらえると、とてもとても助かります。

以上、ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?