and loops でList<string>
対IEnumerable<string>
反復をテストしましたが、リストの方がはるかに高速である可能性はありますか?for
foreach
これらは、私が見つけることができる数少ないリンクのうちの 2 つでありIEnumerable
、List
.
私のテストでは、URL のリストを保持するテキスト ファイルから 10,000 行をロードしていました。
最初に List にロードしてから、 List を IEnumerable にコピーしました
List<string> StrByLst = ...method to load records from the file .
IEnumerable StrsByIE = StrByLst;
したがって、それぞれに10kアイテムがあります タイプ<string>
各コレクションを 100 回ループすると、つまり 100K の反復が発生します。
List<string>
より驚くべき 50 倍高速ですIEnumerable<string>
それは予測可能ですか?
- アップデート
これはテストを行っているコードです
string WorkDirtPath = HostingEnvironment.ApplicationPhysicalPath;
string fileName = "tst.txt";
string fileToLoad = Path.Combine(WorkDirtPath, fileName);
List<string> ListfromStream = new List<string>();
ListfromStream = PopulateListStrwithAnyFile(fileToLoad) ;
IEnumerable<string> IEnumFromStream = ListfromStream ;
string trslt = "";
Stopwatch SwFr = new Stopwatch();
Stopwatch SwFe = new Stopwatch();
string resultFrLst = "",resultFrIEnumrable, resultFe = "", Container = "";
SwFr.Start();
for (int itr = 0; itr < 100; itr++)
{
for (int i = 0; i < ListfromStream.Count(); i++)
{
Container = ListfromStream.ElementAt(i);
}
//the stop() was here , i was doing changes , so my mistake.
}
SwFr.Stop();
resultFrLst = SwFr.Elapsed.ToString();
//forgot to do this reset though still it is faster (x56??)
SwFr.Reset();
SwFr.Start();
for(int itr = 0; itr<100; itr++)
{
for (int i = 0; i < IEnumFromStream.Count(); i++)
{
Container = IEnumFromStream.ElementAt(i);
}
}
SwFr.Stop();
resultFrIEnumrable = SwFr.Elapsed.ToString();
更新...最終
for ループの外にカウンタを取り出し、
int counter = ..count
IEnumerable と List の両方
次に、 @ScottChamberlain によって提案された合計アイテム数として counter(int) を渡しました。すべてが整っていることを再確認した結果、IEnumerable が 5% 速くなりました。結論として、シナリオ別の使用 - ユースケース...パフォーマンスの違いはまったくありません...