C#のメモリやGCについて、ご教授ください。
現在、以下のようなソースのメモリ軽減、処理速度(実行速度)上昇をしたいと思っています。
class setString{
void setString(List<List<List<string>>> data, ref string outputData){
int lCount1 = data.count();
for(int lc1 = 0; lc1 < lCount; lc1++){
List<List<string>> l1 = data[lc1];
int lCount2 = l1.count();
for(int lc2 = 0; lc2 < lCount2; lc2++){
List<string> l2 = l1[lc2];
switch(lc2){
case 0: name += l2[lc2]; break;
case 1: age += l2[lc2]; break;
cade 2: sex += l2[lc2]; break;
}
}
outputdata += "¥n";
}
}
}
このsetString関数のメモリ、時間軽減を考えています。
※実際はわざわざ再宣言してListをつくるような処理はしていません。引数は上記ソース引数のListの各要素をアドレス配列で受けます。l2のアドレスでListを取ってきて、ループさせる、みたいな。諸事情で、引数自体の見直しは一旦考えず、ただただ上記の関数内の処理をどうにかしたいと考えています。
個人的に懸念している点は、メモリ使用量です。
上記の作りだと、毎回Listを作って、メモリ食いをしています。
マネージ、アンマネージの知識が薄く、GCがどれほど有用なのか、という点が分かりかねており、対処法に悩んでいます。
ちなみに、インターフェースになってきて、IDisposableクラスの継承は困難です。
たとえば、for単位で関数を作り、呼び出し後にGC.Colect();を足すとどうでしょうか?
void setString(List<List<List<string>>> data){
int lCount1 = data.count();
l1Set(data, lCount1);
GC.Colect();
}
void setl1(List<List<List<string>>> data, ref string output){
int lCount1 data.count();
for(int lc1 = 0; lc1 < lCount; lc1++){
・
・
・
}
}
※上記のように、set2、set3を作る形です。setStringの関数呼び出し後のようにGC.Colect();を足して変化があるのかは謎で、あくまで方法案です。
foreachよりforが速度は勝ると思ってforは推奨方針、refなどを使って等も考えたのですが、いまひとつピンと来ていません。
メソッド分けは有用やこういうのがスマート、などあればお教えください。
お手数ですが、宜しくお願い致します。
No.2
- 回答日時:
同じく
name
age
sex
の取扱いの問題だとおもいます。
この関数の内部で最適化できる要素が見つかりません。
ごみも貯めてませんので、ごみ捨ても無意味とおもいます。
ご回答ありがとうございました。
とりあえずkmeeさんからお教えいただいた、StringBuilderへの切り替えで概ね平常運転してくれました。
実際はそこそこのステップ数になるメソッドでしたが、投稿にあたって簡略化しようとしたところ、あまりうまくいかず、読みづらくなってしまいすみません。
No.1ベストアンサー
- 回答日時:
「毎回Listを作って」なんてこと、してませんけど?
List<List<string>> l1 = data[lc1];
List<string> l2 = l1[lc2];
ここのことを「毎回Listを作って」と言っているのなら、間違っています。
Listは参照型であり、ここでは「参照値を覚えるための変数(高々数バイト分」しか使われません。
ここでメモリを圧迫するとは思えません。
文字列連結が効いてるように思います
https://dobon.net/vb/dotnet/string/stringbuilder …
見るのが遅くなりました。
StringBuilderを使ってみたところ、非常に速度が上がりました。
メモリに関しては、Listではなく、※記載のList要素アドレス配列などを持つクラスオブジェクトが邪魔をしていたようです。
勘違いでした。すみません。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マルチスレッドで同時にFTPアッ...
-
C#で型変換
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
ループ処理の際、最後だけ","を...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
Junitテストでvoid戻り値メッソ...
-
シャットダウンフックが呼ばれない
-
EXCEL VBA で、0から?1から?
-
テキストボックスに入力された...
-
べき乗
-
グレイコードの変換
-
C# ListBoxのインデックスの値...
-
javaで質問です。 文字列2023/2...
-
C言語のポインターに関する警告
-
IF関数でEmpty値を設定する方法。
-
Java配列でNullPointerExceptio...
-
EclipseでJava
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
特定の文字列が一致する行から...
-
strcmp関数などでの複数の文字...
-
C#でIPアドレスの取得について
-
Delphiで改行文字の置換がうま...
-
C#での関数テーブルの作り方
-
C# JSONについて
-
C#でプロパティを使わずXMLにデ...
-
C#で型変換
-
マルチスレッドで同時にFTPアッ...
-
「指定されたキャストは有効で...
-
GridViewで複数のDropDownList...
-
【Java8以降】csvファイルの複...
-
strtokでの空文字への置き換え
-
C++ ファイルからデータを取得
-
C++のSTL mapを使用するとセグ...
-
GDI+ DrawString() で指定範囲...
-
std::stringの継承
-
string→CStringの型変換について
-
2つのリストのマージ方法について
おすすめ情報
set1の引数間違えました。
ListとListCountとref outputになります。
更に誤りがありました。
name、age、sexに代入ではなく、outputDataに+=で足します