আপনি ভিবিএ কোডের চলমান সময় কীভাবে পরীক্ষা করবেন?


95

ভিবিএতে কি কোড রয়েছে আমি এটি দিয়ে কোনও ফাংশনটি গুটিয়ে রাখতে পারি যে এটি চালানোর সময়টি আমাকে জানতে পারে, যাতে আমি বিভিন্ন চলমান সময়গুলির সাথে তুলনা করতে পারি?

উত্তর:


82

আপনার ফাংশনগুলি খুব ধীর না হলে আপনার খুব উচ্চ-রেজোলিউশনের টাইমার লাগবে। আমি জানি সবচেয়ে সঠিক এক QueryPerformanceCounter। আরও তথ্যের জন্য এটি গুগল। নিম্নলিখিতটিকে কোনও শ্রেণিতে ঠেলে দেওয়ার চেষ্টা করুন, এটিকে CTimerবলুন, তারপরে আপনি বিশ্বব্যাপী কোনও উদাহরণ তৈরি করতে পারেন এবং কেবল কল করুন .StartCounterএবং.TimeElapsed

Option Explicit

Private Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long

Private m_CounterStart As LARGE_INTEGER
Private m_CounterEnd As LARGE_INTEGER
Private m_crFrequency As Double

Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256#

Private Function LI2Double(LI As LARGE_INTEGER) As Double
Dim Low As Double
    Low = LI.lowpart
    If Low < 0 Then
        Low = Low + TWO_32
    End If
    LI2Double = LI.highpart * TWO_32 + Low
End Function

Private Sub Class_Initialize()
Dim PerfFrequency As LARGE_INTEGER
    QueryPerformanceFrequency PerfFrequency
    m_crFrequency = LI2Double(PerfFrequency)
End Sub

Public Sub StartCounter()
    QueryPerformanceCounter m_CounterStart
End Sub

Property Get TimeElapsed() As Double
Dim crStart As Double
Dim crStop As Double
    QueryPerformanceCounter m_CounterEnd
    crStart = LI2Double(m_CounterStart)
    crStop = LI2Double(m_CounterEnd)
    TimeElapsed = 1000# * (crStop - crStart) / m_crFrequency
End Property

4
আমি এটি এক্সেল ভিবিএতে প্রয়োগ করেছি (এই কেবি নিবন্ধে উল্লিখিত ওভারহেডে যোগ করা: সমর্থন . microsoft.com/kb/172338 . এটি দুর্দান্ত কাজ করেছে। ধন্যবাদ
ল্যান্স রবার্টস

4
ধন্যবাদ, এটি আমার পক্ষেও ভাল কাজ করে। TimeElapsed()মিলি সেকেন্ডে ফলাফল দেয়। আমি কোনও ওভারহেড ক্ষতিপূরণ কার্যকর করিনি কারণ আমি নিখুঁত নির্ভুলতার চেয়ে ওভারহেড গণনায় স্টটারের প্রভাব সম্পর্কে বেশি চিন্তিত ছিলাম।
জাস্টিন

4
এটি অনেকগুলি শোনা গেছে (পরিচালনা করার কোডের পংক্তিতে) - আপনি যদি 10 মিমি নির্ভুলতার সাথে বাঁচতে পারেন তবে নীচে @ কোডাকের উত্তরটি কোডের এক লাইনে একই জিনিস দেয় ( GetTickCountকার্নেল 32 থেকে আমদানি করা)।
BrainSlugs83

আপনি কিভাবে ব্যবহার করবেন StartCounterআর TimeElapsed? আমি CTimerশুরুতে একটি উদাহরণস্বরূপ টাইমার With StartCounterকরেছি এবং আমি কেবল .StartCounterআমার সাব শুরু হওয়ার পরে লিখেছিলাম .TimeElapsedএবং এটি আমাকে উত্তর দিয়েছে Invalid use of property। যখন আমি .StartCounterএকা ছেড়ে দিই তা আমাকে বলে যে কোনও বস্তু সেট করা নেই।
মনিকা 20

: Excel 2010 Declare PtrSafe Function stackoverflow.com/questions/21611744/...
user3226167

49

ভিবিএতে টাইমার ফাংশন আপনাকে মধ্যরাত থেকে সেকেন্ডের সেকেন্ডের সংখ্যা দেয়, এক সেকেন্ডের 1/100 করে।

Dim t as single
t = Timer
'code
MsgBox Timer - t

18
এটি কার্যকর হবে না - আপনি এর মতো গড় না নিয়ে আরও রেজোলিউশন পেতে পারেন না।
অ্যান্ড্রু স্কাগনেলি

4
তবুও, আপনি যদি ভিবিএতে পারফরম্যান্স পরিমাপ করেন তবে দ্বিতীয় রেজোলিউশনের 1/100 তম পাওয়া খারাপ নয়। - একাই টাইমিং কলগুলি চালানো কয়েক মিনিট এমএস নিতে পারে। যদি কলটি এত তাড়াতাড়ি হয় যে আপনার সময়ে সময়ে এতগুলি রেজোলিউশন প্রয়োজন, আপনার সম্ভবত সেই কল সম্পর্কে পারফরম্যান্স ডেটার প্রয়োজন হবে না।
BrainSlugs83

4
দ্রষ্টব্য: ম্যাকে
টাইমারটি

32

আপনি যদি স্টপ ওয়াচের মতো সময় ফিরিয়ে দেওয়ার চেষ্টা করছেন আপনি নিম্নলিখিত এপিআই ব্যবহার করতে পারেন যা সিস্টেম শুরু হওয়ার পর থেকে মিলি সেকেন্ডে সময় দেয়:

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Sub testTimer()
Dim t As Long
t = GetTickCount

For i = 1 To 1000000
a = a + 1
Next

MsgBox GetTickCount - t, , "Milliseconds"
End Sub

http://www.pcreview.co.uk/forums/grab-time-milliseconds-incused-vba-t994765.html এর পরে (উইনএম.ডিএল-তে টাইমগেটটাইম আমার পক্ষে কাজ করছিল না এবং কোয়েরি পারফরম্যান্সকাউন্টার প্রয়োজনীয় কাজের জন্য খুব জটিল ছিল)


এটি একটি দুর্দান্ত উত্তর। নোট: স্পষ্টতা ফেরত আসা ডাটার মিলিসেকেন্ডে, কিন্তু, কাউন্টার শুধুমাত্র সঠিক 1 সম্পর্কে থেকে / এক সেকেন্ডের 100 তম (যে, এটি বন্ধ 10 16 MS হতে পারে) দুটিই MSDN মাধ্যমে: msdn.microsoft.com / এন-
ইউএস

হুম, যদি রেজোলিউশনটি এখানে টাইমারের মতো হয় তবে আমি টাইমারের সাথে যাব
কোডক

Public Declare Function ...অংশটি কী ? আমার
কোডটির

আপনাকে এই সর্বজনীন ঘোষণাটি আপনার মডিউলের শীর্ষে স্থানান্তরিত করতে হবে
কোডক

4

নবীবিদের জন্য, এই লিঙ্কগুলি ব্যাখ্যা করে যে আপনি যে সমস্ত সাবসকে সময় নিরীক্ষণ করতে চান তার একটি স্বয়ংক্রিয় প্রোফাইলিং কীভাবে করবেন:

http://www.nullskull.com/a/1602/profiling-and-optimizing-vba.aspx

http://sites.mcpher.com/share/Home/excelquirks/optimizationlink মধ্যে procProfiler.zip দেখতে http://sites.mcpher.com/share/Home/excelquirks/downlable-items


3
Sub Macro1()
    Dim StartTime As Double
    StartTime = Timer

        ''''''''''''''''''''
            'Your Code'
        ''''''''''''''''''''
    MsgBox "RunTime : " & Format((Timer - StartTime) / 86400, "hh:mm:ss")
End Sub

আউটপুট:

রানটাইম: 00:00:02


2

আমরা বহু বছরের জন্য মিলিসেকেন্ড যথার্থতার জন্য winmm.dll তে টাইম গেটটাইমের উপর ভিত্তি করে একটি সমাধান ব্যবহার করেছি। Http://www.aboutvb.de/kom/artikel/komstopwatch.htm দেখুন

নিবন্ধটি জার্মান ভাষায় রয়েছে তবে ডাউনলোডের কোডটি (একটি ভিবিএ ক্লাসটি ডিএল ফাংশন কলটি মোড়ানো) নিবন্ধটি পড়তে সক্ষম না হয়ে ব্যবহার এবং বুঝতে যথেষ্ট সহজ।


0

2 দশমিক স্পেস সহ সেকেন্ডস:

Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime) / 1000000, "#,##0.00") & " seconds") 'end timer

সেকেন্ড বিন্যাস

মিলিসেকেন্ড:

Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime), "#,##0.00") & " milliseconds") 'end timer

মিলিসেকেন্ডের ফর্ম্যাট

কমা পৃথককারী সহ মিলিসেকেন্ড:

Dim startTime As Single 'start timer
MsgBox ("run time: " & Format((Timer - startTime) * 1000, "#,##0.00") & " milliseconds") 'end timer

কমা বিভাজক সহ মিলিসেকেন্ড

আমার মতো সেকেন্ডে 2 দশমিক স্পেসে ফর্ম্যাটেড একটি সাধারণ টাইমার সন্ধান করতে চাইছিল এমন কারও জন্য কেবল এটি এখানে রেখে চলেছি। এগুলি শর্ট এবং মিষ্টি ছোট টাইমারগুলি আমি ব্যবহার করতে পছন্দ করি। তারা কেবল সাব বা ফাংশনের শুরুতে কোডের একটি লাইন এবং শেষে আবার একটি লাইন কোড গ্রহণ করে। এগুলি নির্ভুল পাগল হওয়ার জন্য নয়, আমি সাধারণত ব্যক্তিগতভাবে এক সেকেন্ডের 1/100 তম এর চেয়ে কম কিছু নিয়ে চিন্তা করি না, তবে মিলি সেকেন্ডের টাইমার আপনাকে এই 3 এর সবচেয়ে সঠিক রান সময় দেবে I've আমি আপনাকেও পড়েছি মধ্যরাত পেরিয়ে যাওয়ার সময় যদি এটি ঘটে তখন ভুল পড়তে পারে, এটি একটি বিরল উদাহরণ, তবে কেবল এফওয়াইআই।


টাইমারের 10 মিমি রেজোলিউশন হওয়ায় কেবল প্রথমটি কার্যকর।
গুস্তাভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.