Hãy tưởng tượng mã:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Phương pháp 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Phương pháp 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Tôi tò mò liệu có sự khác biệt về hiệu suất của 2 chức năng này hay không, bởi vì chức năng thứ nhất NÊN TRỞ LÊN so với chức năng thứ hai - với điều kiện là nó cần kiểm tra hai lần nếu từ điển có chứa giá trị, trong khi chức năng thứ hai chỉ cần truy cập từ điển một lần nhưng WOW, nó thực sự ngược lại:
Lặp lại cho 1 000 000 giá trị (với 100 000 hiện có và 900 000 không tồn tại):
chức năng đầu tiên: 306 mili giây
chức năng thứ hai: 20483 mili giây
Tại sao vậy?
EDIT: Như bạn có thể nhận thấy trong các bình luận bên dưới câu hỏi này, hiệu suất của chức năng thứ hai thực sự tốt hơn một chút so với lần đầu tiên trong trường hợp có 0 khóa không tồn tại. Nhưng một khi có ít nhất 1 hoặc nhiều khóa không tồn tại, hiệu suất của khóa thứ hai sẽ giảm nhanh chóng.
O(1)
tra cứu trong từ điển ... Đặc biệt là khi thực hiện hai O(1)
thao tác vẫn không có triệu chứng O(1)
.
ContainsKey
được mong đợiO(1)
...