lazy-programmer
20-02-2003, 16:11
Vừa rồi Lazyman có so sánh tốc độ tính toán của VB.Net và C#. Nhiều bạn không tin là có sự chênh lệch hàng nghìn lần về tốc độ tính toán các phép tính phức tạp nên mình post lên source code của cả hai class viet bang VB.Net va C# để tính lịch Âm - Dương. Các bạn load về, tạo thêm các project mới và add các tập tin gởi kèm vào để thử. Vì cả hai là dạng lib (.DLL) nên để thử các bạn cần thêm một project winform nữa.
Đại khái là một form có vài controls như textbox để hiển thị kết quả tính toán và thời gian chạy, hai button để chạy các tính toán. Tôi có làm một cái, dưới đây là trích code trong cái form ấy (gồm hai events khi nhấn hai nút Calculate) để các bạn có thể sử dụng các lib này:
Dim V1 As New VietCalLibByVB.Vietnamese()
Dim G1 As New VietCalLibByVB.Gregorian()
Dim V2 As New VietCalLib.Vietnamese()
Dim G2 As New VietCalLib.Gregorian()
Private Sub btnCalcualateByVB_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnCalculateByVB.Click
Dim t1, t2 As Date
Dim i As Integer
Me.Cursor = System.Windows.Forms.Cursors.WaitCursor
t1 = Now
For i = 1 To 10
G1.fromFixed(V1.newYear(Me.DateTimePicker1.Value.Y ear))
Next
t2 = Now
Me.txtResultByVB.Text = G1.day.ToString & "/" & _
G1.month.ToString & "/" & G1.year.ToString
Me.txtTimeByVB.Text = (t2.Ticks - t1.Ticks) / 100000
Me.Cursor = System.Windows.Forms.Cursors.Default
End Sub
Private Sub btnCalcualteByC_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnCalculateByC.Click
Dim t3, t4 As Date
Dim i As Integer
t3 = Now
For i = 1 To 10
G2.fromFixed(V2.newYear(Me.DateTimePicker1.Value.Y ear))
Next
t4 = Now
Me.txtResultByC.Text = G2.day.ToString & "/" & _
G2.month.ToString & "/" & G2.year.ToString
Me.txtTimeByC.Text = (t4.Ticks - t3.Ticks) / 100000
End Sub
Đây là phép tính ra ngày Tết AL của các năm, kết quả là ngày Dương lịch tương ứng.
Các bạn nhớ AddReference đến hai thư viện VietCalLibByVB và VietCalLib (cái này bằng C#). Kết quả được tính bằng 1/100s. Để đảm bảo tính chinh xác các bạn cho chạy vài lần với các năm 2003, 2004, 2005 rồi tính trung bình (năm 2004 là năm có tháng AL nhuận nên tính toán mất nhiều thời gian hơn).
Tôi tin là có sự chênh lệch hàng nghìn lần (tùy theo máy của bạn), nhưng cũng xin lạm bàn một chút về chuyện các ngôn ngữ:
Thứ nhất: C# chỉ nhanh hơn VB.Net trong việc tính toán phức tạp, không quá vượt trội trong các ứng dụng WinForm thuần túy.
Thứ hai: Tuy không nên viết một chương trình cờ tướng thuần túy bằng VB.Net (các bạn cứ thử viết Simple Chinese Chess với độ sâu 7 và chờ máy tính đi xem!!!) nhưng môi trường pt của VB lại hết sức thân thiện. Các IntelliSense nhanh nhạy, đầy đủ. Các event có thể tự động phát sinh. Còn ở C# bạn phải làm thủ công hầu hết mọi việc. Đôi khi chỉ có nước là xem cấu tạo của các events bên VB rồi chuyển sang C#.
Thứ ba: C# thiếu các hàm bổ trợ, đôi khi rất cần khi phải pt nhanh u/dụng như các hàm tính toán về DateTime như DateAdd(), DateDiff(), các hàm chuyển đổi dạng dữ liệu trực tiếp như CInt(), CStr()... Bạn cũng phải tự tạo các hàm này nếu muốn có được môi trường pt thân thiện hơn.
Thứ tư: Pt bằng C# chắc chắn sẽ có ít các lỗi vô tình hơn vì đây là một ngôn ngữ có yêu cầu cao về việc chuyển đổi dữ liệu và sự chặt chẽ trong cú pháp. Hơn nữa, viết bằng C# cũng uyển chuyển hơn trong việc khai báo biến, tiết kiệm được nhiều sự rườm ra không cần thiết trong khi viết mã. Giá phải trả là chương trình trở nên khó hiểu hơn, nếu các bạn kg comments đầy đủ.
Thứ năm: C# hỗ trợ các class tốt hơn với các từ khóa static mà nhờ đó bạn có thể s/d trực tiếp các hàm mà không cần tạo ra các instant của lớp đó và nhiều tiện ích khác.
Tóm lại: VB.Net sẽ thích hợp cho việc pt các WinForm và để giảng dạy/ viết các tutorial. Còn C# nên dành cho các bạn có thiên tư trong hardcoding, và x/d các lib đòi hỏi tình toán nhiều.
Đây chỉ là một vài so sánh có tính hơi "bề ngoài". Mong các bạn góp ý.
[dww@ - thông tin chỉnh sửa : cho xuống hàng vài đoạn code dài quá để giảm chiều ngang các bài viết]
Đại khái là một form có vài controls như textbox để hiển thị kết quả tính toán và thời gian chạy, hai button để chạy các tính toán. Tôi có làm một cái, dưới đây là trích code trong cái form ấy (gồm hai events khi nhấn hai nút Calculate) để các bạn có thể sử dụng các lib này:
Dim V1 As New VietCalLibByVB.Vietnamese()
Dim G1 As New VietCalLibByVB.Gregorian()
Dim V2 As New VietCalLib.Vietnamese()
Dim G2 As New VietCalLib.Gregorian()
Private Sub btnCalcualateByVB_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnCalculateByVB.Click
Dim t1, t2 As Date
Dim i As Integer
Me.Cursor = System.Windows.Forms.Cursors.WaitCursor
t1 = Now
For i = 1 To 10
G1.fromFixed(V1.newYear(Me.DateTimePicker1.Value.Y ear))
Next
t2 = Now
Me.txtResultByVB.Text = G1.day.ToString & "/" & _
G1.month.ToString & "/" & G1.year.ToString
Me.txtTimeByVB.Text = (t2.Ticks - t1.Ticks) / 100000
Me.Cursor = System.Windows.Forms.Cursors.Default
End Sub
Private Sub btnCalcualteByC_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnCalculateByC.Click
Dim t3, t4 As Date
Dim i As Integer
t3 = Now
For i = 1 To 10
G2.fromFixed(V2.newYear(Me.DateTimePicker1.Value.Y ear))
Next
t4 = Now
Me.txtResultByC.Text = G2.day.ToString & "/" & _
G2.month.ToString & "/" & G2.year.ToString
Me.txtTimeByC.Text = (t4.Ticks - t3.Ticks) / 100000
End Sub
Đây là phép tính ra ngày Tết AL của các năm, kết quả là ngày Dương lịch tương ứng.
Các bạn nhớ AddReference đến hai thư viện VietCalLibByVB và VietCalLib (cái này bằng C#). Kết quả được tính bằng 1/100s. Để đảm bảo tính chinh xác các bạn cho chạy vài lần với các năm 2003, 2004, 2005 rồi tính trung bình (năm 2004 là năm có tháng AL nhuận nên tính toán mất nhiều thời gian hơn).
Tôi tin là có sự chênh lệch hàng nghìn lần (tùy theo máy của bạn), nhưng cũng xin lạm bàn một chút về chuyện các ngôn ngữ:
Thứ nhất: C# chỉ nhanh hơn VB.Net trong việc tính toán phức tạp, không quá vượt trội trong các ứng dụng WinForm thuần túy.
Thứ hai: Tuy không nên viết một chương trình cờ tướng thuần túy bằng VB.Net (các bạn cứ thử viết Simple Chinese Chess với độ sâu 7 và chờ máy tính đi xem!!!) nhưng môi trường pt của VB lại hết sức thân thiện. Các IntelliSense nhanh nhạy, đầy đủ. Các event có thể tự động phát sinh. Còn ở C# bạn phải làm thủ công hầu hết mọi việc. Đôi khi chỉ có nước là xem cấu tạo của các events bên VB rồi chuyển sang C#.
Thứ ba: C# thiếu các hàm bổ trợ, đôi khi rất cần khi phải pt nhanh u/dụng như các hàm tính toán về DateTime như DateAdd(), DateDiff(), các hàm chuyển đổi dạng dữ liệu trực tiếp như CInt(), CStr()... Bạn cũng phải tự tạo các hàm này nếu muốn có được môi trường pt thân thiện hơn.
Thứ tư: Pt bằng C# chắc chắn sẽ có ít các lỗi vô tình hơn vì đây là một ngôn ngữ có yêu cầu cao về việc chuyển đổi dữ liệu và sự chặt chẽ trong cú pháp. Hơn nữa, viết bằng C# cũng uyển chuyển hơn trong việc khai báo biến, tiết kiệm được nhiều sự rườm ra không cần thiết trong khi viết mã. Giá phải trả là chương trình trở nên khó hiểu hơn, nếu các bạn kg comments đầy đủ.
Thứ năm: C# hỗ trợ các class tốt hơn với các từ khóa static mà nhờ đó bạn có thể s/d trực tiếp các hàm mà không cần tạo ra các instant của lớp đó và nhiều tiện ích khác.
Tóm lại: VB.Net sẽ thích hợp cho việc pt các WinForm và để giảng dạy/ viết các tutorial. Còn C# nên dành cho các bạn có thiên tư trong hardcoding, và x/d các lib đòi hỏi tình toán nhiều.
Đây chỉ là một vài so sánh có tính hơi "bề ngoài". Mong các bạn góp ý.
[dww@ - thông tin chỉnh sửa : cho xuống hàng vài đoạn code dài quá để giảm chiều ngang các bài viết]