Biến integer & biến long cái nào nhanh hơn?

  • Thread starter Thread starter digita
  • Ngày gửi Ngày gửi
Liên hệ QC
D

digita

Guest
Tối nay rãnh rổi tôi làm thữ 1 thí nghiệm nho nhỏ và rất ngạc nhiên khi thấy kết quả. Muốn vào trong link http://www.giaiphapexcel.com/forum/showthread.php?t=13195&page=2 đóng góp ý kiến thì thấy nó bị khóa. Đọc kỹ các bài thì tôi đoán được lý do. Dù sao, tôi cũng khám phá 1 cái lạ và muốn chia sẽ với các anh chị em trong GPE.

Các bạn chạy code sau rồi sẽ thấy câu trả lời nhá.

Mã:
Sub BenchMark()
Dim VInt1 As Integer, VInt2 As Integer, VInt3 As Integer
Dim VLong1 As Long, VLong2 As Long, VLong3 As Long
Dim BMInt As Double, BMLong As Double

BMInt = Timer

For VInt1 = 1 To 254
  For VInt2 = 1 To 254
     VInt3 = (VInt1 + VInt2) / VInt1 ^ 2
  Next
Next
BMInt = Timer - BMInt

BMLong = Timer
For VLong1 = 1 To 254
  For VLong2 = 1 To 254
      VLong3 = (VLong1 + VLong2) / VLong1 ^ 2
  Next
Next
BMLong = Timer - BMLong
MsgBox "Dim Integer time = " & Format(BMInt, "#.####0") &  " secs" & vbNewLine & _
           " Dim Long time = " & Format(BMLong, "#.####0") & " secs"

End Sub

Ndu ơi,

Rất khâm phục cách đối xử của bạn. Tuy nhiên, như mình nói với bạn trước đây mình dám nhận danh xưng thầy hay cao thũ vì mình không phải là thầy giáo và luôn luôn biết giới hạn sự hiểu biết của mình. Tôi chỉ muốn là người đồng hành tham gia và học hòi thêm từ bạn và các thành viên khác trong diễn đàn này. Vậy xin bạn đừng gọi tôi là thầy nữa nha.

Kiến thức, theo thiển ý tôi, là 1 phần của nhân phẩm. Mà là con người không ai hoàn thiện hết. Đọc qua câu văn cách hành văn thì có thể biết nhân cách và ẩn ý của người viết.

Chúc mọi người 1 cuối tuần an lành.
 
Mình thử đổi cụm vòng lặp dưới lên trên, thì kết quả mỗi lúc 1 khác; lúc thì bằng nhau, lúc thì hơn kém nhau 3 lần(!)
Không rõ máy mình có vấn đề gì không nữa.

Thứ đến: Cũng có lúc NDU gọi mình là sư phụ; Vì là trên mạng nên mình cho rằng ai cũng có thể là sư phụ của mình; & chính vì vậy, mình điều chỉnh cách xưng hô của NDU, hãy gọi mình là sư chính kia đó!
Một khía cạnh khác, ở đây cũng có thể người đang ngồi trên ghế nhà trường cũng có thể gọi những người có cháu nội/ ngoại là bạn, thì chẩng lẽ đi trách người ta sao?!

Theo mình, họ gọi gì mà không tìm cách xúc phạm mình là được rồi! Còn lại chỉ chuyện khác thì ta hạ mình xuống hơn 1 chút để hòa đồng cùng cộng đồng; đó là cái quan trọng.
Ai chẵng mong iên gió lặng sóng, hỡi Digita!
. . . .
imagesCAHTB5FL.jpg

 
Upvote 0
Nguyên văn bởi digita
Biến integer & biến long cái nào nhanh hơn?
-Mình cũng làm thí nghiệm như trên, thậm chí còn khai báo thêm các kiểu khác, vẫn không xác định được khai báo kiểu biến nào là cải thiện được tốc độ.
-Về vấn đề này, mình có ý kiến như sau:
+Khai báo kiểu biến không ảnh hưởng trực tiếp đến tốc độ, nhưng sẽ ảnh hưởng đến tài nguyên. Nếu tài nguyên hạn chế, tốc độ sẽ bị ảnh hưởng.
+Khi ta đã xác định được phạm vi của biến, nên khai báo phù hợp để tiết kiệm tài nguyên. Ví dụ: số học sinh trong lớp, số lớp trong trường... mà khai báo Long thì quá lãng phí.
+Nói chung, tiết kiệm tài nguyên phải là một mối quan tâm của người lập trình. Ví dụ như khi lập trình trên một số thiết bị phần cứng mà tài nguyên hạn chế : điện thoại di động, máy nghe nhạc, loa...
+Môi trường GPE rất trong sáng, không nên dùng những từ: sư phụ, đệ tử, cao thủ võ lâm...Gọi nhau bằng cách xưng hô thông thường thì hay hơn mà tránh được cho những người bạn gọi là thầy, là sư phụ cảm giác áy náy, khó chịu.
 
Upvote 0
Theo tôi, phạm vi làm việc của 2 loại biến khác nhau ---> tốc độ xử lý sẽ khác nhau.
Có thể việc thi hành thủ tục xử lý dữ liệu của bác digita chưa được lâu lắm nên việc nhận biết, so sánh giữa chúng là khó.
 
Upvote 0
Theo tôi việc khai báo biến là tùy thuộc vào yêu cầu của chương trình mình.
Nếu mình có thể xác định được biến của mình là nằm trong khoảng Integer thì mình khai báo là Integer, nếu nằm trong khoảng của Long thì mình khai báo là Long.
Ví dụ: nếu ta dùng biến để lấy thứ tự hàng (Row) thì ta khai báo là kiểu Long.
Việc nhanh hay chậm, như chúng ta cũng đã bàn luận nhiều, nó phụ thuộc vào nhiều yếu tố.

Lê Văn Duyệt
 
Upvote 0
Thực hiện phép thử tốc độ giữa INTEGER và LONG

Tôi thực hiện 100 phép thử, mỗi phép thử thực hiện 30.000 phép tính cộng (+) với 2 loại biến INTEGER và LONG.

Tôi lấy thời gian trung bình của 100 phép thử của 2 loại biến làm cơ sở so sánh. Đơn vị đo thời gian là mili giây.

Thủ tục test:

Mã:
Option Explicit

Declare Function QueryPerformanceCounter Lib "Kernel32" _
                        (X As Currency) As Boolean
Declare Function QueryPerformanceFrequency Lib "Kernel32" _
                        (X As Currency) As Boolean

Private Sub DoTocDoINTEGER_LONG()
    '
    ' QueryPerformanceFrequency API Function
    ' QueryPerformanceCounter API Function
    '
    Const SoLanThuNghiem = 100
    Const SoPhepTinh = 30000
    
    Dim T1@, T2@, Freq@, Overhead@, I&
    Dim LValue As Long, LIndex As Long, LAVGMS As Double
    Dim iValue As Integer, iIndex As Integer, iAVGMS As Double
    Dim ChenhLech As Double
    
    Static SolanChay As Long
    SolanChay = SolanChay + 1
    
    QueryPerformanceFrequency Freq
    QueryPerformanceCounter T1
    QueryPerformanceCounter T2
    Overhead = T2 - T1
    
    For I = 1 To SoLanThuNghiem
        [U][COLOR="SeaGreen"]'INTEGER:[/COLOR][/U]
        QueryPerformanceCounter T1
         
        iIndex = 0
        Do
            iIndex = iIndex + 1
            
        Loop Until iIndex >= SoPhepTinh
        
        QueryPerformanceCounter T2
        
        iAVGMS = iAVGMS + (T2 - T1 - Overhead) / Freq * 1000
    
       [COLOR="SeaGreen"][U] 'LONG:[/U][/COLOR]
        QueryPerformanceCounter T1
                
        LIndex = 0
        Do
            LIndex = LIndex + 1
            
        Loop Until LIndex >= SoPhepTinh
        
        QueryPerformanceCounter T2
        
        LAVGMS = LAVGMS + (T2 - T1 - Overhead) / Freq * 1000
            
    Next I
   
   [COLOR="Red"]'Để hiện của sổ thông báo kết quả, trong VBE nhấn CTRL+G để mở cửa sổ "Immediate"[/COLOR]
    Debug.Print "---Chay lan " & SolanChay & "--------------------------------------------------"
    Debug.Print "Thuc hien " & SoLanThuNghiem & " lan, moi lan chay " & SoPhepTinh & " phep tinh."
    Debug.Print "So giay trung binh moi lan:"
    Debug.Print "INTEGER: ", iAVGMS / 100, "milliseconds(ms)"
    Debug.Print "LONG: ", LAVGMS / 100, "milliseconds(ms)"
    ChenhLech = iAVGMS / 100 - LAVGMS / 100
    Debug.Print "INTEGER " & IIf(ChenhLech > 0, "cham", "nhanh") & " hon LONG la: " & Abs(Round(ChenhLech, 4)) & " milliseconds(ms)"
End Sub

Kết quả nhận được:

---Chay lan 1--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.03613168712783 milliseconds(ms)
LONG: 0.974850155536528 milliseconds(ms)
INTEGER cham hon LONG la: 0.0613 milliseconds(ms)
---Chay lan 2--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.04313537055687 milliseconds(ms)
LONG: 0.995442158151385 milliseconds(ms)
INTEGER cham hon LONG la: 0.0477 milliseconds(ms)
---Chay lan 3--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.032614480332 milliseconds(ms)
LONG: 0.975322282580607 milliseconds(ms)
INTEGER cham hon LONG la: 0.0573 milliseconds(ms)
---Chay lan 4--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.01438590658869 milliseconds(ms)
LONG: 0.992528380003603 milliseconds(ms)
INTEGER cham hon LONG la: 0.0219 milliseconds(ms)
---Chay lan 5--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 0.991134348080552 milliseconds(ms)
LONG: 0.978839489376443 milliseconds(ms)
INTEGER cham hon LONG la: 0.0123 milliseconds(ms)
---Chay lan 6--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.08906858273887 milliseconds(ms)
LONG: 0.974241139586176 milliseconds(ms)
INTEGER cham hon LONG la: 0.1148 milliseconds(ms)
---Chay lan 7--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.0005629207064 milliseconds(ms)
LONG: 0.986806982451681 milliseconds(ms)
INTEGER cham hon LONG la: 0.0138 milliseconds(ms)
---Chay lan 8--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.03776597304965 milliseconds(ms)
LONG: 0.957574216834821 milliseconds(ms)
INTEGER cham hon LONG la: 0.0802 milliseconds(ms)
---Chay lan 9--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.05319530834226 milliseconds(ms)
LONG: 1.02144546304069 milliseconds(ms)
INTEGER cham hon LONG la: 0.0317 milliseconds(ms)
---Chay lan 10--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.03859289378957 milliseconds(ms)
LONG: 0.938599738234887 milliseconds(ms)
INTEGER cham hon LONG la: 0.1 milliseconds(ms)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hoá ra Integer luôn chậm hơn so với Long? Cũng hay nhỉ
 
Upvote 0
Rất cám ơn tất cả các bạn đóng góp ý kiến. Code bạn Tuấn chạy tính tới chính xác đến millisecond quá xá dữ :-).

Ủa, tôi down cái file của bạn Tuấn về rồi chạy code nó cho kết quả như sau:

---Chay lan 1--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.52813276547718 milliseconds(ms)
LONG: 1.72284745686952 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1947 milliseconds(ms)

Sửa code trên đặt thêm 1 vòng lặp nửa thì sẽ thấy biến Long lúc nào cũng nhanh hơn integer.

Mã:
Sub BenchMark()
Dim VInt1 As Integer, VInt2 As Integer, VInt3 As Integer
Dim VLong1 As Long, VLong2 As Long, VLong3 As Long
Dim BMInt As Double, BMLong As Double
Dim LoopInt As Integer, LoopLong As Long

BMInt = Timer

For LoopInt = 1 To 254
 For VInt1 = 1 To 254
  For VInt2 = 1 To 254
     VInt3 = (VInt1 + VInt2) / VInt1 ^ 2
  Next
 Next
Next
BMInt = Timer - BMInt

BMLong = Timer
For LoopLong = 1 To 254
 For VLong1 = 1 To 254
  For VLong2 = 1 To 254
      VLong3 = (VLong1 + VLong2) / VLong1 ^ 2
  Next
 Next
Next
BMLong = Timer - BMLong
MsgBox "Dim Integer time = " & Format(BMInt, "#.####0") & " secs" & vbNewLine & _
           " Dim Long time = " & Format(BMLong, "#.####0") & " secs"

End Sub

Còn code anh Tuấn chạy nhanh hơn nhưng cho kết quả ngược lại. Có ai có giống kết quả tương tự không?
 
Upvote 0
Vậy câu trả lời chúng ta là gì?
Dailydose
Theo Dailydose:
Dailydose đã viết:
...If you use the Integer data type in your code, Excel will convert it to a Long, so you might as well just use Long. It still produces an overflow error if you get outside the Integer bounds, I’ve noticed...

Theo Microsoft:
msdn.microsoft.com
msdn.microsoft.com đã viết:
...The Integer and Long data types can both hold positive or negative values. The difference between them is their size: Integer variables can hold values between -32,768 and 32,767, while Long variables can range from -2,147,483,648 to 2,147,483,647. Traditionally, VBA programmers have used integers to hold small numbers, because they required less memory. In recent versions, however, VBA converts all integer values to type Long, even if they are declared as type Integer. Therefore, there is no longer a performance advantage to using Integer variables; in fact, Long variables might be slightly faster because VBA does not have to convert them...

Do convert tất cả các kiểu Integer sang kiểu Long --> Chậm hơn.

Nhưng theo tôi, mỗi khi bạn muốn sử dụng một biến bạn nên xác định xem kiểu gì bạn nên dùng. Như vậy sẽ tạo thành một thói quen tốt trong quá trình lập trình.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Mặc dù điều này tôi đã biết từ cách đây 10 năm rồi, song chắc mọi người vẫn còn nghi ngờ nên làm những test ở trên. Hãy đọc hiểu về bản chất của việc lưu trữ các giá trị trong các thanh ghi khi compiler nó dịch ra mã máy thế nào ấy (nên mới: "VB converts all integer values to type Long, even if they are declared as type Integer"). Những bài viết về optimization thế này có từ cách đây hơn chục năm rồi mà (từ hồi có VB3 xuất hiện cũng đã có nhiều bài nói rồi) :)

Còn dĩ nhiên, tốc độ nhanh hơn hay chậm hơn là bao nhiêu nó còn phụ thuộc vào khối lượng test (số lần đọc/ghi biến), tốc độ của CPU, v.v...).

+Khai báo kiểu biến không ảnh hưởng trực tiếp đến tốc độ, nhưng sẽ ảnh hưởng đến tài nguyên. Nếu tài nguyên hạn chế, tốc độ sẽ bị ảnh hưởng.
+Khi ta đã xác định được phạm vi của biến, nên khai báo phù hợp để tiết kiệm tài nguyên. Ví dụ: số học sinh trong lớp, số lớp trong trường... mà khai báo Long thì quá lãng phí.

Ngay cả danh mục thuế GTGT có vài loại thuế thôi, nhưng khi tạo danh mục thì vẫn theo chuẩn:

ID (PK) --> Long (Int in MS SQL)
Code (Unique index) --> Varchar(10)
Name --> Varchar(255)
v.v....

Tất cả các ID của các đối tượng khi thiết kế Database nên đều là: Hoặc Long (tương ứng với INT trong MS SQL), hoặc là GUID. KHÔNG NÊN DÙNG KIỂU KHÁC.

Trong Class, luôn luông dùng Long cho ID, miễn dùng kiểu khác (Kể cả danh mục đó có ... 1 bản ghi đi chăng nữa). Đã là phần mềm, người dùng có thể nhập 1 triệu bản ghi (cho cái bảng mà ta nghĩ chỉ có 1 bản ghi đó). Tất cả các phần mềm có tên có tuổi, có số có má trên thị trường phần mềm nước ngoài (kể cả ERP solutions) cũng đã làm như vậy. Quyết định của bạn có làm như thế hay ko thì TÙY!

Với lại, tôi nghĩ những khái niệm trên là "ready in thinking" đối với dân làm soft rồi (trừ những người mới vào nghề). Bao giờ thành viên mới tham gia dự án chúng tôi cũng gửi những quy định lập trình (gọi là coding guideline - toàn những thứ đã trở thành patterns rồi) và ... MIỄN THẮC MẮC. (ví dụ chuyện phải release objects sau khi dùng, phải comments trong code,... là điều hiển nhiên rồi)

Tóm lại, (theo tôi) tập trung vào làm cái khác hiệu quả hơn đi! (vì Long faster than Integer là chắc 100% rồi, ai đồng ý thì thay đổi cách làm, ai ko đồng ý thì giữ nguyên cách làm cũ). Dĩ nhiên, khai báo cho các biến số thể hiện giá trị tiền tệ, tỷ lệ, lãi suất,... thì ko thể Long được rồi --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Còn dĩ nhiên, tốc độ nhanh hơn hay chậm hơn là bao nhiêu nó còn phụ thuộc vào khối lượng test (số lần đọc/ghi biến), tốc độ của CPU, v.v...). Tập chung vào làm cái khác hiệu quả hơn đi!


Hoàn toàn nhất trí, nhiều khi phải đơn giản hóa những cái mà thiên hạ cho là phức tạp, và hãy phức tạp hóa những cái mà thiên hạ cho là đơn giản.

Giống như khẩu hiệu của chứng khoán : Hãy sợ hãi khi thiên hạ tham lam, và hãy tham lam khi thiên hạ sợ hãi.

Bác lúc nào cũng out of box!
Tập chung vào làm cái khác hiệu quả hơn đi!

Lại sai chính tả rồi !:-=

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên văn bởi hai2hai
Tóm lại, (theo tôi) tập trung vào làm cái khác hiệu quả hơn đi! (vì Long faster than Integer là chắc 100% rồi, ai đồng ý thì thay đổi cách làm, ai ko đồng ý thì giữ nguyên cách làm cũ). Dĩ nhiên, khai báo cho các số thể hiện tiền bạc, tỷ lệ, lãi suất,... thì ko thể Long được rồi
-Mình chưa nhất trí với ý kiến này. Bởi vì, diễn đàn là nơi để ta nghiên cứu, học tập. Có những điều đối với bạn đã quá xưa cũ nhưng đối với người chưa biết là rất mới mẽ. Các bạn đã có bề dày nghiên cứu, có trình độ cao nên giúp đỡ dìu dắt người đi sau và những người không có điều kiện học trường lớp như các bạn. Không nên nói rằng:" Có thế mà không biết, mất thời gian, làm việc khác tốt hơn."
-Mình mong vấn đề Biến integer & biến long cái nào nhanh hơn? được các bạn, nhất là các chuyên gia trong lĩnh vực lập trình trao đổi nhiều hơn, hướng dẫn nhiều hơn cho mình học tập. Bởi lẽ những điều ấy gần như trái ngược với những gì có ở các sách dạy căn bản về VB6, lập trình Excel trong khai báo biến (Kể cả sách của bác Hướng cũng không nói )
-Mình đã tải file của TuanVNUNI và test. Kết quả như sau:
---Chay lan 1--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.52956452177391 milliseconds(ms)
LONG: 1.69937658117094 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1698 milliseconds(ms)
---Chay lan 2--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.58588820558972 milliseconds(ms)
LONG: 1.73096215189241 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1451 milliseconds(ms)
---Chay lan 3--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.53533303334833 milliseconds(ms)
LONG: 1.69551092445378 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1602 milliseconds(ms)
---Chay lan 4--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.58226943652817 milliseconds(ms)
LONG: 1.74641307934603 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1641 milliseconds(ms)
---Chay lan 5--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.58953802309884 milliseconds(ms)
LONG: 1.78513734313284 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1956 milliseconds(ms)
---Chay lan 6--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.59033173341333 milliseconds(ms)
LONG: 1.80381555922204 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.2135 milliseconds(ms)
---Chay lan 7--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.62199385030748 milliseconds(ms)
LONG: 1.75100349982501 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.129 milliseconds(ms)
---Chay lan 8--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.58189960501975 milliseconds(ms)
LONG: 1.7517983100845 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1699 milliseconds(ms)
---Chay lan 9--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.56769631518424 milliseconds(ms)
LONG: 1.69255127243638 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1249 milliseconds(ms)
---Chay lan 10--------------------------------------------------
Thuc hien 100 lan, moi lan chay 30000 phep tinh.
So giay trung binh moi lan:
INTEGER: 1.59109569521524 milliseconds(ms)
LONG: 1.75284960751962 milliseconds(ms)
INTEGER nhanh hon LONG la: 0.1618 milliseconds(ms)
Thật là khó hiểu!
 
Upvote 0
Đừng để cho thời gian cách nhau ít quá vậy.

Hãy tạo ra 1 VD, có khoảng 100 biến, sử dụng khoảng 50 vòng lặp, chạy khoảng 50.000lần/vòng , tính toán phức tạp hơn thì sẽ thấy ngay là cái nào nhanh hơn.

Chứ mấy cái phép tính đơn giản thì rất khó để hơn thua, khác nào bảo rằng Celeron 2,4GHz và Pentium 2,4Ghz cũng chẳng khác gì nhau trong việc sử dụng đánh văn bản bằng word !!!!!!!

Cái điều nhanh chậm thì bác Duyệt đã trích dẫn rất rõ rồi, Bill cũng công nhận như thế.

Đối với em (cá nhân): Thay vì thời gian bỏ ra để tìm hiểu xem tại sao Bill lại không làm như ta nghĩ thì để tìm hiểu về cái khác sẽ có ích hơn. (Giống như cứ tìm hiểu mãi về cái vụ tại sao trong VBA True = -1??)


Thân!
 
Upvote 0
1. Mọi người cho tôi biết site này có nguồn gốc từ đâu? http://msdn.microsoft.com

2. Ai giỏi tiếng anh dịch hộ tôi sang tiếng Việt câu cuối cùng của đoạn thứ 2 trong đường link sau đây:
http://msdn.microsoft.com/en-us/library/aa164754(office.10).aspx

Cụ thể là câu
Therefore, there is no longer a performance advantage to using Integer variables; in fact, Long variables might be slightly faster because VBA does not have to convert them...

3.
Còn dĩ nhiên, tốc độ nhanh hơn hay chậm hơn là bao nhiêu nó còn phụ thuộc vào khối lượng test (số lần đọc/ghi biến), tốc độ của CPU, v.v...).
Nếu chỉ for i = 1 to 10 thôi thì i là long hay integer thì ko đánh giá được kết quả vì có thể lúc đó xung nhịp của CPU ở cái tích tắc đó nó khác nhau. TUY NHIÊN, VỀ BẢN CHẤT: LONG VARIANT NHANH HƠN INTEGER VÌ KHI LƯU TRỮ BIẾN LONG, INTEGER, BYTE THÌ NÓ ĐỀU CHUYỂN SANG LONG TRƯỚC RỒI MỚI LƯU VÀO THANH GHI (2 LỆNH RÕ RÀNG PHẢI MẤT THỜI GIAN HƠN 1 LỆNH). UNDERSTAND?

Chứ mấy cái phép tính đơn giản thì rất khó để hơn thua, khác nào bảo rằng Celeron 2,4GHz và Pentium 2,4Ghz cũng chẳng khác gì nhau trong việc sử dụng đánh văn bản bằng word !!!!!!!
==> Ví dụ hay lắm!

4.
....nhất là các chuyên gia trong lĩnh vực lập trình trao đổi nhiều hơn, hướng dẫn nhiều hơn cho mình học tập. Bởi lẽ những điều ấy gần như trái ngược với những gì có ở các sách dạy căn bản về VB6, lập trình Excel trong khai báo biến
- Không có gì đáng để trao đổi, đơn giản vì: 2 LỆNH RÕ RÀNG PHẢI MẤT THỜI GIAN HƠN 1 LỆNH (bản chất là một thanh ghi lưu đủ giá trị 32-bit signed integer, vì thế các trình dịch chuyển hết Integer sang Long).
- Chỉ ngược với sách dịch sang tiếng Việt :P, có thể tìm giúp tôi câu nào trong sách viết bằng tiếng anh (sách của NXB nổi tiếng 1 tý, ko chơi sách noname) nói biến Integer nhanh hơn biến Long thì báo giùm tôi (chứ ko nói là tiết kiệm bộ nhớ hơn vì ai cũng hiểu điều đó). Tôi sẽ chịu trách nhiệm liệc lạc trực tiếp với tác giả cuốn sách và M$ để làm rõ điều đó.

5. Chúng ta hãy nhìn lại các hàm APIs chuẩn của Windows đi, xem tại sao giá trị trở về lúc nào cũng là kiểu Long trong khi chỉ trở về giá trị 0 hoặc -1 (mà đáng ra họ chỉ cần khai báo kiểu Boolean). Đó chính là lý do họ (Microsofter chính hiệu) sử dụng biến kiểu Long thay vì kiểu khác. Nếu mọi người quen viết C for Windows thì chắc cũng thấy chuyện đó rất đỗi bình thường.
Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Public Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long

6. Dùng biến kiểu byte khi nào?
However, the Byte data type is typically used for working with strings. For some string operations, converting the string to an array of bytes can significantly enhance performance.

7.
Không nên nói rằng: "Có thế mà không biết, mất thời gian, làm việc khác tốt hơn."
Tôi ko dùng từ ngữ trẻ con như thế, tôi chỉ nói là: Khi đã có chứng minh rõ ràng như 1 với 1 là 2 thì nên chuyển sang vấn đề khác thì hiệu quả hơn. Mọi người có thể chứng minh định lý (như hồi còn học đại học), còn theo tôi (tôi chỉ nói là theo tôi thôi), thì nên chuyển sang áp dụng định lý vào công việc cụ thể thì hiệu quả hơn. Dĩ nhiên, những ai còn theo đuổi con đường khoa học thì vẫn có thể chứng minh lại các định lý đó (thậm chí có thể tìm mọi cách để chứng minh định lý đó là sai). Thế nên tôi mới nói:

Nếu là tôi thì tôi sẽ ko tiếp tục nghiên cứu vấn đề trên mà quyết định chọn ngay hướng hiệu quả: Chọn kiểu Long (fastest) thay vì kiểu Byte cho biến i. Hiện nay, tất cả các vòng For trong code tôi đều chuyển sang biến chạy có Long để đảm bảo 2 nguyên tắc cơ bản trong lập trình: Không lỗi (phải vét cạn trường hợp tối đa và tối thiểu) và tăng tốc độ.

Tóm lại, (theo tôi) tập trung vào làm cái khác hiệu quả hơn đi!

...Ai đồng ý thì thay đổi cách làm, ai ko đồng ý thì giữ nguyên cách làm cũ...

P/S: Hồi ở trong trường, tôi cũng ko được dạy Long với Integer thì cái nào nhanh hơn vì hồi tôi học thì chỉ có Pascal với C thôi (sau 4 năm ra trường thì kiến thức của tôi chỉ là If Then Else thôi, chả hơn gì bất cứ 1 ai ở đây cả). Tuy nhiên, thời nay với 1 cú google thì ko thiếu tài liệu nào nói về chuyện đó (và nhất là chuyện code optimizing, tài liệu nào nó cũng nói về chuyện khai báo biến đó).

Tôi vẫn giúp các bạn đấy chứ (chỉ có điều giúp theo cách khác mà thôi). Tức là, chỉ rất rõ lý do của "hiện tượng" này (vì đã "nghiên cứu" và biết trước mọi người về vấn đề này rồi) và đã khuyên các bạn chuyển ngay sang vấn đề khác (gọi là cách làm hiệu quả, tiết kiệm thời gian cho các bạn) thay vì tiếp tục nghiên cứu "hiện tượng" này :). Theo tôi, đó là cách giúp đỡ hiệu quả (lợi ích của việc "biết và áp dụng" lớn hơn nhiều so với việc tiếp tục nghiên cứu tại sao Long faster than Integer)
Các bạn đã có bề dày nghiên cứu, có trình độ cao nên giúp đỡ dìu dắt người đi sau và những người không có điều kiện học trường lớp như các bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên văn bởi hai2hai
Tôi vẫn giúp các bạn đấy chứ (chỉ có điều giúp theo cách khác mà thôi).
Cám ơn sự trợ giúp của bạn. Xin bạn hiểu cho vấn đề mình quan tâm ở đây là: Biến Byte, Integer convert sang Long trong quá trình chạy code. Theo mình, ngoài sự chỉ ra hiện tượng cần phải có thêm những lý giải thỏa đáng:
1. Nếu biến Byte, Interger luôn convert sang Long thì trong trường hợp nào ta khai báo Byte, Interger? Hay là nó bị thừa?
2. Tại sao file test của bác TuanVNUNI cho ra kết quả INTEGER nhanh hon LONG, trong khi INTEGER =>chạy 2 lệnh, LONG => chạy 1 lệnh?
3. Cơ chế hoạt động của code khi chạy nhự thế nào?. Lệnh convert chạy trước hay sau lệnh chương trình?
4. Vì sao khi Byte, Integer đã convert sang Long, nghĩa là trở thành Long, ta vẫn bị báo lỗi Overflow khi biến vượt quá giới hạn của Byte hoặc Integer?
Mong sự hỗ trợ của bạn. Cám ơn nhiều.
------------------------------------------------------
XIN CÁC BẠN QUAN TÂM: MÌNH KHÔNG THẮC MẮC VỀ CHUYỆN NHANH HAY CHẬM CỦA LONG VÀ INTEGER. VẤN ĐỀ LÀ : BYTE, INTEGER convert sang LONG.
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề này Microsoft hay các chuyên gia đi trước đã có kết luận là INTEGER chậm hơn LONG thì chúng ta cứ tin là vậy. Về một phần căn nguyên anh Hải cũng đã nói rồi, nhưng có lẽ mọi người có quan niệm "trăm nghe không bằng một thấy,..." vì thế topic này vẫn chưa được khép lại.

Tôi làm thủ tục test muốn chứng minh về tốc độ giữa 2 biến INTEGER và LONG nhưng không ngờ cũng sinh ra 2 kết quả khác nhau trên 2 môi trường VB6 và VBA.

Cũng các lệnh test trên tôi chuyển sang VB6 và biên dịch->exe, kết quả INTEGER nhanh hơn LONG, nếu chạy trong VBA thì luôn luôn là INTEGER chậm hơn LONG?

Có lẽ thủ tục test của tôi chưa đầy đủ dữ kiện ?
 

File đính kèm

Upvote 0
Em không biết tạo trên VB6 thì có khác gì không? Nhưng tạo trong VBA thì vẫn thấy là Long chậm hơn Integer. Khảo sát trên 1 trăm lần chạy và tính thời gian. Cũng khảo sát thêm cách đặt vị trí Long trước và sau Integer luôn. Điều cho kết quả gần nhau, mặt dù có sê dịch chút ít! Các test lại có đúng với kết quả ban đầu của em không nha! (Có thể là do các phần mềm đang sử dụng trên máy làm thay đổi hoặc cản trở tốt độ sử lý) @TuanVNUNI: File INTEGER_LONG.exe của bác khi mở lên có lúc thì bảo là nhanh hơn, bấm thêm cái nữa thì bảo là chậm hơn, nên nghĩ có thể do các phần mềm chiếm dụng RAM đang sử dụng gây nên không biết ý bác thế nào? Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1. Trong nhiều lần chạy trên cùng 1 máy, có lúc cái form trắng tinh (ko có tý code nào) của tôi mãi mới hiện ra, có lúc nó hiện ra cái vèo. Mọi người nghĩ tại sao?

Bây giờ mọi người vào Ctrl + Alt + Del, rồi vào Tab Performance, sau đó ... giơ 2 tay lên đầu và nhìn cái CPU Usage. Các bạn phải tự suy ra vấn đề chứ???? (Thế nên mới có các kết quả test khác nhau khi bấm liên tục vào nút tính toán)

Tại sao có lúc nó tụt tít xuống dưới, lúc sau lại vèo lên tít trên. Khi đó mấy cái for i = 1 to 1,000,000 của mọi người ăn thua gì?

Thử test thế này xem

Mã:
'// Integer Test
j% = 0
For i% = 1 to 32000
   j% = j% + 1
   for k% = 1 to j%
    '// Do some integer operation here
   next
Next

'// Long Test
j& = 0
For i& = 1 to 32000
   j& = j& + 1
   for k& = 1 to j&
    '// Do some Long operation here
   next
Next

Kết quả:
59f434_Int_vs_Long.jpg


2. Dùng biến kiểu byte khi nào?
However, the Byte data type is typically used for working with strings. For some string operations, converting the string to an array of bytes can significantly enhance performance.

3. Dùng biến kiểu Integer khi nào?
- Trong hầu hết các trường hợp, bạn nên dùng kiểu Long.
- Bạn có thể dùng Integer trong trường hợp bạn chắc chắn 100% là không dùng vượt quá 2 bytes (chỉ khi nào xác định ko bị underflow and overflow cho kết quả tính toán). Vì lý do này, tôi khuyên các bạn nên dùng Long thay vì Integer vì đã là phần mềm thì rất ít khi xác định trước các giá trị làm cho underflow and overflow.
- Chủ yếu sử dụng nếu trong thủ tục/hàm đó sử dụng các biến arrays, collections hoặc sử dụng quá nhiều biến. Khi đó kết quả tính toán có thể chậm chút xíu song bù lại khi bạn allocate bộ nhớ cho biến array, collection thì sẽ tiết kiệm bộ nhớ hơn khi chạy thủ tục đó.

4. Trên PSC có rất rất nhiều người đã có những test và guideline này rồi.

5.
4. Vì sao khi Byte, Integer đã convert sang Long, nghĩa là trở thành Long, ta vẫn bị báo lỗi Overflow khi biến vượt quá giới hạn của Byte hoặc Integer?
Cái này lại là cả 1 vấn đề liên quan tới trình "biên dịch" (compiler) và "thông dịch" (Interpreter)

Integer trong VB6, VBA thì là 16 bits, signed, nhưng khi dịch sang mã máy thì vẫn thừa 2 bytes trên thanh ghi (4 bytes) (đối với 32-bit processor). Còn khi tính toán thì vẫn sử dụng 16 bits chứ ko phải 32 bits. Mọi người bắt đầu đi quá sâu trong khi tớ lại lại phải đi kiếm tiền (10:30AM mà lại đi trả lời web) . :)

6. Kiểu Integer trong .NET giờ tương ứng với kiểu Long trong VB6 (tức là đều là System.Int32 - 4 bytes cả). Kiểu Long trong .NET giờ là 8 bytes rồi.

7. Các bạn đọc thêm 1 lần nữa: http://msdn.microsoft.com/en-us/library/7f5ztkz3(VS.71).aspx
On 32-bit systems, 32-bit integer operations are faster than either 16-bit or 64-bit integer operations. This means that in Visual Basic .NET, Integer (tương ứng với kiểu Long trong VB6) is the most efficient and fundamental numeric type. You can improve performance in your applications by changing your Long declarations to Integer when you migrate to Visual Basic .NET.

http://msdn.microsoft.com/en-us/library/06bkb8w2.aspx

Remarks (Integer ở đây nhắc tới là Integer trong .NET, tức là kiểu Long trong VB6)

The Integer data type provides optimal performance on a 32-bit processor. The other integral types are slower to load and store from and to memory.

8. Có thể dùng các công cụ của Numega (Softice, Smartcheck, DevPartner), hay AQTime,... để debug xem ứng dụng chạy thì nó làm những gì (không phải debug bình thường kiểu ta hay làm đâu). Nếu theo dõi VBA thì có thể theo dõi được cả Excel nó hoạt động thể nào (chính vì thế mà dân CR nó dùng các công cụ đó để "phá" các bảo mật phần mềm). M$ cũng mua các công cụ đó để test các ứng dụng và thậm chí cả HĐH của mình.

P/S: Rất rất nhiều chỗ nói về vẫn đề này (32 bits signed nhanh hơn 16 bits signed). Tuy có hiểu về bản chất nhưng tôi vẫn tính thích theo chủ nghĩa áp dụng! Nghiên cứu để người khác giỏi hơn làm!
 
Lần chỉnh sửa cuối:
Upvote 0
Tuy có hiểu về bản chất nhưng tôi vẫn tính thích theo chủ nghĩa áp dụng! Nghiên cứu để người khác giỏi hơn làm!
Việc cùng 1 thủ tục nhưng lại chạy với 2 thời gian khác nhau ở hai thời điểm khác nhau trên cùng 1 máy là chuyện thường, lúc nào chẳng bị. Vì vậy việc đó chẳng có gì lạ cả.

Chúng ta đang trong thời kỳ "Phần mềm ứng dụng", Office cũng là một gói phần mềm như vậy.
Đừng đòi hỏi sự tối đa, chỉ cần tối ưu là hạnh phúc lắm rồi.

Thân!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom