![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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.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要素アドレス配列などを持つクラスオブジェクトが邪魔をしていたようです。
勘違いでした。すみません。
ご回答ありがとうございました。
No.3
- 回答日時:
ループ内での文字列の継ぎ足し連結は非常識。
また、ガベコレを頻繁に行うとメチャ遅くなります。
ご回答ありがとうございます。
ループ内の文字列連結は今回のことでつくづく学びました。
GC多発で遅くなるというのは初めて伺いました。
これまではDisposeがあれば幸いですが、無いときでメモリに困ったら、とにかくGC.Colect乱射みたいな行為に走っていました。
今後気を付けます。
お探しの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ランキング
-
Delphiで改行文字の置換がうま...
-
strcmp関数などでの複数の文字...
-
C# ListBoxのアイテムをユーザ...
-
PHPのSHA256変換について
-
特定の文字列が一致する行から...
-
string→CStringの型変換について
-
【Java8以降】csvファイルの複...
-
strtokでの空文字への置き換え
-
マルチスレッドで同時にFTPアッ...
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
ダブルクォーテーションのrepla...
-
C言語32bitから64bitの移行につ...
-
javaで質問です。 文字列2023/2...
-
VBAで配列の計算
-
BOOL値を逆にしたい
-
[Ljava.lang.Stringってなんですか
-
1~100までの数字を表示したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字列が一致する行から...
-
C# ListBoxのアイテムをユーザ...
-
strcmp関数などでの複数の文字...
-
【Java8以降】csvファイルの複...
-
C#での関数テーブルの作り方
-
C#でIPアドレスの取得について
-
「指定されたキャストは有効で...
-
マルチスレッドで同時にFTPアッ...
-
C# JSONについて
-
Delphiで改行文字の置換がうま...
-
C#でプロパティを使わずXMLにデ...
-
C++におけるポインターと変数の...
-
jap実行時のTomcatのエラーに困...
-
C# で、あるフォルダー内にある...
-
決まった拡張子のファイルだけ...
-
strtokでの空文字への置き換え
-
c言語
-
javascript初心者
-
python文字列置換について。
-
strncpy後のatoiがおかしい
おすすめ情報
set1の引数間違えました。
ListとListCountとref outputになります。
更に誤りがありました。
name、age、sexに代入ではなく、outputDataに+=で足します