ভিবিএতে কি কোড রয়েছে আমি এটি দিয়ে কোনও ফাংশনটি গুটিয়ে রাখতে পারি যে এটি চালানোর সময়টি আমাকে জানতে পারে, যাতে আমি বিভিন্ন চলমান সময়গুলির সাথে তুলনা করতে পারি?
ভিবিএতে কি কোড রয়েছে আমি এটি দিয়ে কোনও ফাংশনটি গুটিয়ে রাখতে পারি যে এটি চালানোর সময়টি আমাকে জানতে পারে, যাতে আমি বিভিন্ন চলমান সময়গুলির সাথে তুলনা করতে পারি?
উত্তর:
আপনার ফাংশনগুলি খুব ধীর না হলে আপনার খুব উচ্চ-রেজোলিউশনের টাইমার লাগবে। আমি জানি সবচেয়ে সঠিক এক 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
TimeElapsed()
মিলি সেকেন্ডে ফলাফল দেয়। আমি কোনও ওভারহেড ক্ষতিপূরণ কার্যকর করিনি কারণ আমি নিখুঁত নির্ভুলতার চেয়ে ওভারহেড গণনায় স্টটারের প্রভাব সম্পর্কে বেশি চিন্তিত ছিলাম।
GetTickCount
কার্নেল 32 থেকে আমদানি করা)।
StartCounter
আর TimeElapsed
? আমি CTimer
শুরুতে একটি উদাহরণস্বরূপ টাইমার With StartCounter
করেছি এবং আমি কেবল .StartCounter
আমার সাব শুরু হওয়ার পরে লিখেছিলাম .TimeElapsed
এবং এটি আমাকে উত্তর দিয়েছে Invalid use of property
। যখন আমি .StartCounter
একা ছেড়ে দিই তা আমাকে বলে যে কোনও বস্তু সেট করা নেই।
Declare PtrSafe Function
stackoverflow.com/questions/21611744/...
ভিবিএতে টাইমার ফাংশন আপনাকে মধ্যরাত থেকে সেকেন্ডের সেকেন্ডের সংখ্যা দেয়, এক সেকেন্ডের 1/100 করে।
Dim t as single
t = Timer
'code
MsgBox Timer - t
আপনি যদি স্টপ ওয়াচের মতো সময় ফিরিয়ে দেওয়ার চেষ্টা করছেন আপনি নিম্নলিখিত এপিআই ব্যবহার করতে পারেন যা সিস্টেম শুরু হওয়ার পর থেকে মিলি সেকেন্ডে সময় দেয়:
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 এর পরে (উইনএম.ডিএল-তে টাইমগেটটাইম আমার পক্ষে কাজ করছিল না এবং কোয়েরি পারফরম্যান্সকাউন্টার প্রয়োজনীয় কাজের জন্য খুব জটিল ছিল)
Public Declare Function ...
অংশটি কী ? আমার
নবীবিদের জন্য, এই লিঙ্কগুলি ব্যাখ্যা করে যে আপনি যে সমস্ত সাবসকে সময় নিরীক্ষণ করতে চান তার একটি স্বয়ংক্রিয় প্রোফাইলিং কীভাবে করবেন:
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
Sub Macro1()
Dim StartTime As Double
StartTime = Timer
''''''''''''''''''''
'Your Code'
''''''''''''''''''''
MsgBox "RunTime : " & Format((Timer - StartTime) / 86400, "hh:mm:ss")
End Sub
আউটপুট:
রানটাইম: 00:00:02
আমরা বহু বছরের জন্য মিলিসেকেন্ড যথার্থতার জন্য winmm.dll তে টাইম গেটটাইমের উপর ভিত্তি করে একটি সমাধান ব্যবহার করেছি। Http://www.aboutvb.de/kom/artikel/komstopwatch.htm দেখুন
নিবন্ধটি জার্মান ভাষায় রয়েছে তবে ডাউনলোডের কোডটি (একটি ভিবিএ ক্লাসটি ডিএল ফাংশন কলটি মোড়ানো) নিবন্ধটি পড়তে সক্ষম না হয়ে ব্যবহার এবং বুঝতে যথেষ্ট সহজ।
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 আমি আপনাকেও পড়েছি মধ্যরাত পেরিয়ে যাওয়ার সময় যদি এটি ঘটে তখন ভুল পড়তে পারে, এটি একটি বিরল উদাহরণ, তবে কেবল এফওয়াইআই।