Bài viết này hay. Không phải hay vì luận lý, mà hay ở cách dùng cú pháp để diễn đạt tư tưởng. Nếu chấm điểm trong một lớp học văn chương, thì 9 điểm (trừ một điểm cho văn phạm). Còn chấm điểm kỹ thuật, thì chỉ được 7 điểm là tối đa.
Đây là câu kết luận của tác giả:
Therefore, I strongly feel if you are planning to write high performance code that is not for collections, use for loop. Even for collections, foreach may look handy when using, but it's not that efficient. Therefore, I strongly recommend everyone to use for loop rather than foreach at any stage.
Tạm dịch:
Bởi thế, tôi mạnh dạn nghĩ rằng, nếu các bạn muốn viết code có tốc độ xử lý tốt cho những cấu trúc không phải là ...collections, hãy dùng vòng lặp "for", và ngay cả cho những cấu trúc thuộc về collections. (câu này nghe mâu thuẫn quá). Foreach có thể tiện lợi hơn khi dùng, nhưng nó không có tốc độ xử lý tối ưu. Bởi thế (lại bởi thế), tôi mạnh dạn góp ý (lại mạnh dạn - strongly) với tất cả các bạn, nên dùng vòng lặp "for" thay vì "foreach" trong bất cứ trường hợp nào.
Tôi cũng xin "mạnh dạn" góp ý với tác giả rằng, để có một tốc độ xử lý tối ưu, tác giả nên ném tất cả những vòng lặp "for" và cả C#, C/C++ code vào thùng rác. Hãy viết bằng ngôn ngữ assembly cho có tốc độ tối ưu...
Và cuối cùng, tôi cũng xin "mạnh dạn" đưa ra đây một thí dụ, mà cái vòng lặp "for" yêu mến của tác giả sẽ thật sự rơi vào thùng rác của Windows vì không thể dùng được:
Code:
for (int i = 0; i < someobject.count; i ++)
{
if (someobject[i].somenumber = -1)
{
someobject.RemoveAt(i);
}
}
SomeObject là một lớp collection nào đó, và nó có hàm RemoveAt(n) để xóa bỏ một instance của nó. Khi xóa bỏ đi rồi, thì nó tự động...dàn xếp lại, và cái vòng lặp "for" yêu mến mà tác giả đã mạnh dạn khuyên độc giả nên dùng trong "bất cứ trường hợp nào", có phải chăng, trong trường hợp này, không thể hoạt động theo ý muốn?
Ngược lại, nếu dùng foreach trong trường hợp này thì hoàn toàn không sao.
Code:
foreach (object curObject in someObject)
{
if(curObject.someNumber = -1)
{
someObject.RemoveAt(curObject.index);
}
}
Tác giả đã đúng khi nói rằng (và có chứng minh bằng cách lấy assembly code ra để so sánh) vòng lặp "for" có tốc độ xử lý tốt hơn.
Nhưng tác giả đã sai bét bè be khi "mạnh dạn" cố vấn rằng, hãy dùng vòng lặp "for" trong bất cứ một trường hợp nào.
Được cái này, phải mất cái khác. Chúng ta đang sống trong một thế giới mà thuyết tương đối luôn luôn có một vị thế vững chắc. Theo thiển ý của tôi, hãy dùng "for" khi nào cần dùng, và hãy dùng "foreach" khi cần dùng. Dùng hay không dùng, tất cả đều nên cân nhắc cho kỹ lưỡng và thận trọng.
Bookmarks