我有兩個代碼變數:
第一的:
struct pair_fiodat {string fio; string dat;}
List<pair_fiodat> list_fiodat = new List<pair_fiodat>();
// list filled 200.000 records, omitted.
foreach(string fname in XML_files)
{
// get FullName and Birthday from file. Omitted.
var usersLookUp = list_fiodat.ToLookup(u => u.fio, u => u.dat); // create map
var dates = usersLookUp[FullName];
if (dates.Count() > 0)
{
foreach (var dt in dates)
{
if (dt == BirthDate) return true;
}
}
}
第二:
struct pair_fiodat {string fio; string dat;}
List<pair_fiodat> list_fiodat = new List<pair_fiodat>();
// list filled 200.000 records, omitted.
foreach(string fname in XML_files)
{
// get FullName and Birthday from file. Omitted.
var members = from s in list_fiodat where s.fio == FullName & s.dat == Birthdate select s;
if (members.Count() > 0 return true;
}
他們做同樣的作業——按姓名和生日搜索用戶。第一個作業非常快。第二個非常慢(10x-50x)請告訴我是否可以加速第二個?我的意思是可能需要特別準備的清單?我嘗試排序:list_fiodat_sorted = list_fiodat.OrderBy(x => x.fio).ToList();,但是......
uj5u.com熱心網友回復:
我跳過您的第一個測驗并將 Count() 更改為 Any() (計數迭代所有串列,而當有一個元素時任何停止)
public bool Test1(List<pair_fiodat> list_fiodat)
{
foreach (string fname in XML_files)
{
var members = from s in list_fiodat
where s.fio == fname & s.dat == BirthDate
select s;
if (members.Any())
return true;
}
return false;
}
如果你想優化某些東西,你必須留下舒適的東西,為你提供語言,因為通常這些東西不是免費的,它們是有成本的。例如,for 比 foreach 快。有點難看,你需要兩句話來獲取變數,但更快。如果您迭代一個非常大的集合,則每次迭代總和。LINQ 非常強大,使用它很神奇,但也有成本。如果您將其更改為另一個“for”,則可以節省時間。
public bool Test2(List<pair_fiodat> list_fiodat)
{
for (int i = 0; i < XML_files.Count; i )
{
string fname = XML_files[i];
for (int j = 0; j < list_fiodat.Count; j )
{
var s = list_fiodat[j];
if (s.fio == fname & s.dat == BirthDate)
{
return true;
}
}
}
return false;
}
與普通集合沒有區別,通常您使用 foeach,LINQ ......但在極端情況下,您必須進入低級別。
在您的第一個測驗中,ToLookup 是關鍵。這需要很長時間。想一想:您正在迭代所有串列,創建和填充地圖。這在任何情況下都很糟糕,但考慮一下您要查找的專案位于串列開頭的情況:您只需要幾次迭代即可找到它,但您會花時間在串列中的每個專案上創建地圖. 只有在最壞的情況下,由于創建本身,地圖創建的時間相似并且總是更糟。
例如,如果您需要匹配某個條件的所有專案,則該地圖很有趣,獲取一個串列而不是找到一個專案。您花費時間創建一次地圖,但您多次使用該地圖,并且每次都節省時間(地圖是“直接訪問”,而不是“順序”)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/467648.html
