কোনও পদ্ধতির সম্পাদনের সময়টি ঠিক কীভাবে মিলিসেকেন্ডে লগ করবেন?


222

কোনও পদ্ধতি কার্যকর করার জন্য কত সময় নির্ধারণ করার উপায় আছে (মিলিসেকেন্ডে)?


2
আপনি যে কোনও সুযোগে জিজ্ঞাসা করছেন কারণ আপনি এটি দ্রুত করার জন্য কী অনুকূলিত করতে পারেন তা জানতে চান?
মাইক ডুনলাভে

1
হ্যাঁ, আমি একটি ইউআইবিউবভিউ ব্যবহার করছি যা কিছু পৃষ্ঠা লোড করছে। আমি পৃষ্ঠা 10. সময় পদ্ধতি লোড পৃষ্ঠা 1 প্রয়োজন চেক করে pageloading নিখুত চান
Dan

2
এটি এই প্রশ্নের সদৃশ হিসাবে প্রতীয়মান
ব্র্যাড লারসন

@ ব্র্যাডলারসন এটি একটি সদৃশ বলে মনে হচ্ছে, অন্য প্রশ্নের আরও ভাল উত্তর রয়েছে, যেমন সেখানে বিশিষ্ট উত্তরগুলি এনএসডিট (ভুল) ব্যবহার করার পরামর্শ দিচ্ছে না বরং এর পরিবর্তে এনএসডিটকে এই উদ্দেশ্যে করার ভুল উপায় কেন তা ব্যাখ্যা করে explains
টমাস টেম্পেলম্যান

উত্তর:


437
NSDate *methodStart = [NSDate date];

/* ... Do whatever you need to do ... */

NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f", executionTime);

সুইফট:

let methodStart = NSDate()

/* ... Do whatever you need to do ... */

let methodFinish = NSDate()
let executionTime = methodFinish.timeIntervalSinceDate(methodStart)
print("Execution time: \(executionTime)")

Swift3:

let methodStart = Date()

/* ... Do whatever you need to do ... */

let methodFinish = Date()
let executionTime = methodFinish.timeIntervalSince(methodStart)
print("Execution time: \(executionTime)")

ব্যবহার করা সহজ এবং সাব-মিলিসেকেন্ড যথার্থতা রয়েছে।


3
@PeterWarbo NSTimeInterval ডবল একটি typedef এবং সেকেন্ডে হিসাবে সংজ্ঞায়িত করা হয় - দেখুন developer.apple.com/library/mac/#documentation/Cocoa/Reference/...
বেন Lings

5
আপনি এই মানটি% f - এনএসএলগ ("এক্সিকিউশনটাইম =% এফ", এক্সিকিউশনটাইম) দিয়ে লগ করতে পারেন;
টনি

1
@ আপনি কি ভুলে গেছেন @,NSLog(@"executionTime = %f", executionTime);
জন রিসালভাতো

6
আমি কেবল তুলনা করেছি NSDateএবং mach_absolute_time()প্রায় 30 মিমি স্তরে। 27 বনাম 29, 36 বনাম 39, 43 বনাম 45. NSDateআমার জন্য ব্যবহার করা সহজ ছিল এবং ফলাফলগুলি বিরক্ত না করার মতো যথেষ্ট ছিল mach_absolute_time()
নেভান রাজা

5
এনএসডেটের উপর ভিত্তি করে যে কোনও কিছু অতিক্রান্ত সময় পরিমাপের জন্য নিরাপদ নয় কারণ সময়টি এমনকি পিছনেও লাফিয়ে উঠতে পারে। অনেক নিরাপদ উপায় হ'ল মাচ_অবসুলিউট_টাইম ব্যবহার করা, যেমন এখানে অন্যান্য উত্তরগুলিতে দেখানো হয়েছে। এটির একটি খারাপ উদাহরণ হওয়ার জন্য এটিকে নিম্নোক্ত করা উচিত। এছাড়াও সংশ্লিষ্ট উত্তর যে আরো বিস্তারিতভাবে এই সব ব্যাখ্যা করে দেখুন: stackoverflow.com/a/30363702/43615
টমাস Tempelmann

252

এখানে আমি ব্যবহার করছি দুটি এক-লাইন ম্যাক্রো:

#define TICK   NSDate *startTime = [NSDate date]
#define TOCK   NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])

এটি এর মতো ব্যবহার করুন:

TICK;

/* ... Do Some Work Here ... */

TOCK;

13
হা হা। আমি এটা পছন্দ করি!
ববমফ

5
যা এটিকে এত ভাল করে তোলে, তা কি টিক-টাক এমন একটি স্মরণীয় বাক্য যে লগিংয়ের জন্য প্রায় কোনও চিন্তাভাবনার প্রয়োজন নেই।
জন রিসেলভাতো

30
#define TOCK NSLog(@"%s Time: %f", __func__, -[startTime timeIntervalSinceNow])টাইমারটি কোন ফাংশনে ব্যবহৃত হয়েছিল তা এই উত্তরটিও ফিরিয়ে দেয় I আমি যদি একাধিক ফাংশন সময় টিক টাক ব্যবহার করি তবে আমি এই দরকারী বলে মনে করি।
golmschenk

3
দুর্দান্ত ধারণা এছাড়াও আপনি মধ্যে সন্ধান করতে পারেন __PRETTY_FUNCTION__এবং __LINE__আপনি আরো বিস্তারিত তথ্য চান।
রন

50

ওএস এক্স-তে সূক্ষ্ম শস্যযুক্ত সময়ের জন্য আপনার mach_absolute_time( )ঘোষিত ব্যবহার করা উচিত <mach/mach_time.h>:

#include <mach/mach_time.h>
#include <stdint.h>

// Do some stuff to setup for timing
const uint64_t startTime = mach_absolute_time();
// Do some stuff that you want to time
const uint64_t endTime = mach_absolute_time();

// Time elapsed in Mach time units.
const uint64_t elapsedMTU = endTime - startTime;

// Get information for converting from MTU to nanoseconds
mach_timebase_info_data_t info;
if (mach_timebase_info(&info))
   handleErrorConditionIfYoureBeingCareful();

// Get elapsed time in nanoseconds:
const double elapsedNS = (double)elapsedMTU * (double)info.numer / (double)info.denom;

অবশ্যই সূক্ষ্ম দানযুক্ত পরিমাপ সম্পর্কে স্বাভাবিক সতর্কতাগুলি প্রয়োগ হয়; আপনি সম্ভবত পরীক্ষার অধীনে রুটিনটি বেশ কয়েকবার চাওয়া, এবং গড়পড়তা / ন্যূনতম / কোনও অন্য রূপের প্রক্রিয়াজাতকরণ বন্ধ করে দিতে পারেন।

অতিরিক্ত হিসাবে, দয়া করে নোট করুন যে আপনি শার্কের মতো একটি সরঞ্জাম ব্যবহার করে আপনার অ্যাপ্লিকেশনটি চালানোর জন্য প্রোফাইলটিকে আরও দরকারী মনে করতে পারেন। এটি আপনাকে সঠিক সময়সীমা তথ্য দেবে না, তবে এটি আপনাকে জানাবে যে আবেদনের কত শতাংশ সময় ব্যয় করা হচ্ছে, যা প্রায়শই বেশি কার্যকর (তবে সবসময় নয়)।


1
এটি সুইফটে কাজ করার চেষ্টা করছেন ... কোনও পরামর্শ?
জুমজুম

1
"একজন কেবল
সোফাইটে

@ জুমজুম সুইফটে এটি করার উদাহরণের জন্য আমার উত্তর দেখুন।
jbg

23

এর জন্য একটি সুবিধাজনক মোড়ক রয়েছে mach_absolute_time()- এটি একটি CACurrentMediaTime()ফাংশন।

অফসেটের বিপরীতে NSDateবা CFAbsoluteTimeGetCurrent()অফসেট নয় mach_absolute_time()এবং CACurrentMediaTime()এটি অভ্যন্তরীণ হোস্ট ক্লকের উপর ভিত্তি করে, একটি সুনির্দিষ্ট, একাকীকরণীয় পরিমাপ, এবং বাহ্যিক সময়ের রেফারেন্সের পরিবর্তনের সাপেক্ষে নয় যেমন সময় অঞ্চল, দিবালোকের সঞ্চয় বা লিপ সেকেন্ডের কারণে ঘটে।


ObjC

CFTimeInterval startTime = CACurrentMediaTime();
// Do your stuff here
CFTimeInterval endTime = CACurrentMediaTime();
NSLog(@"Total Runtime: %g s", endTime - startTime);

দ্রুতগতি

let startTime = CACurrentMediaTime()
// Do your stuff here
let endTime = CACurrentMediaTime()
print("Total Runtime: \(endTime - startTime) s")

3
আমি মনে করি এই উত্তরটি আরও উত্সাহের দাবিদার। এটি ব্যবহার করার চেয়ে ভাল NSDate
গড় জো

12

সুইফটে, আমি ব্যবহার করছি:

আমার ম্যাক্রোস.সুইফ্টে আমি সবেমাত্র যুক্ত করেছি

var startTime = NSDate()
func TICK(){ startTime =  NSDate() }
func TOCK(function: String = __FUNCTION__, file: String = __FILE__, line: Int = __LINE__){
    println("\(function) Time: \(startTime.timeIntervalSinceNow)\nLine:\(line) File: \(file)")
}

আপনি এখন কেবল যে কোনও জায়গায় কল করতে পারেন

TICK()

// your code to be tracked

TOCK()
  • এই কোডটি রনের কোডের উপর ভিত্তি করে সুইফটে অনুবাদ করেছে, তার ক্রেডিট রয়েছে
  • আমি গ্লোবাল পর্যায়ে শুরুর তারিখটি ব্যবহার করছি, উন্নতির জন্য যে কোনও পরামর্শই স্বাগত

এটি হওয়া উচিত \(-startTime.timeIntervalSinceNow)(নেতিবাচক দিকে লক্ষ্য করুন)
তুষারমানের

9

আমি জানি এটি একটি পুরানো তবে এমনকি আমি নিজেকে এটির সাথে আবার ঘুরে বেড়াতে দেখেছি, তাই আমি ভেবেছিলাম আমি নিজের বিকল্পটি এখানে জমা দেব।

সেরা বেট হ'ল এটি সম্পর্কে আমার ব্লগ পোস্টটি পরীক্ষা করা: উদ্দেশ্য-সি- তে জিনিসগুলির সময়: একটি স্টপওয়াচ

মূলত, আমি একটি ক্লাস লিখেছিলাম যা খুব প্রাথমিক উপায়ে দেখা বন্ধ করে দেয় না তবে এনপ্যাপসুলেটেড করা হয় যাতে আপনার কেবল নিম্নলিখিতটি করা দরকার:

[MMStopwatchARC start:@"My Timer"];
// your work here ...
[MMStopwatchARC stop:@"My Timer"];

এবং আপনি এখানে দিয়ে শেষ:

MyApp[4090:15203]  -> Stopwatch: [My Timer] runtime: [0.029]

লগ ইন ...

আবার, আমার পোস্টটি আরও কিছুবার জন্য দেখুন বা এটি ডাউনলোড করুন: এমএমএসটোপওয়াচ.জিপ


7

আমি রনের সমাধানের ভিত্তিতে ম্যাক্রোগুলি ব্যবহার করি ।

#define TICK(XXX) NSDate *XXX = [NSDate date]
#define TOCK(XXX) NSLog(@"%s: %f", #XXX, -[XXX timeIntervalSinceNow])

কোড লাইন জন্য:

TICK(TIME1);
/// do job here
TOCK(TIME1);

আমরা কনসোলে এমন কিছু দেখতে পাব: TIME1: 0.096618


আপনার উত্তরটি সত্যই রনের উত্তর থেকে এতটা আলাদা নয় এবং আমি কোনভাবে এটি আরও ভালভাবে দেখতে ব্যর্থ হই?
তারিখের ট্রায়ার্লিয়ন

2
আপনি @ রনের সমাধানটি একটি প্রসঙ্গে দুটি বার ব্যবহার করতে পারবেন না। এটি এই ম্যাক্রোগুলির মূল কারণ।
সের্গেই তেরিওখিন

4

আমি এই ব্লগ পোস্ট থেকে কোড দ্বারা অনুপ্রাণিত খুব ন্যূনতম, একটি পৃষ্ঠার শ্রেণীর প্রয়োগ ব্যবহার করছি :

#import <mach/mach_time.h>

@interface DBGStopwatch : NSObject

+ (void)start:(NSString *)name;
+ (void)stop:(NSString *)name;

@end

@implementation DBGStopwatch

+ (NSMutableDictionary *)watches {
    static NSMutableDictionary *Watches = nil;
    static dispatch_once_t OnceToken;
    dispatch_once(&OnceToken, ^{
        Watches = @{}.mutableCopy;
    });
    return Watches;
}

+ (double)secondsFromMachTime:(uint64_t)time {
    mach_timebase_info_data_t timebase;
    mach_timebase_info(&timebase);
    return (double)time * (double)timebase.numer /
        (double)timebase.denom / 1e9;
}

+ (void)start:(NSString *)name {
    uint64_t begin = mach_absolute_time();
    self.watches[name] = @(begin);
}

+ (void)stop:(NSString *)name {
    uint64_t end = mach_absolute_time();
    uint64_t begin = [self.watches[name] unsignedLongLongValue];
    DDLogInfo(@"Time taken for %@ %g s",
              name, [self secondsFromMachTime:(end - begin)]);
    [self.watches removeObjectForKey:name];
}

@end

এটির ব্যবহার খুব সহজ:

  • শুধু [DBGStopwatch start:@"slow-operation"];শুরুতে কল করুন
  • এবং তারপরে সমাপ্তির [DBGStopwatch stop:@"slow-operation"];পরে, সময়টি পেতে

3

আপনি এই স্টপওয়াচ ক্লাসটি ব্যবহার করে সত্যই সূক্ষ্ম সময় (সেকেন্ডের সেকেন্ডের পার্টস) পেতে পারেন । এটি আইফোনে উচ্চ-নির্ভুলতা টাইমার ব্যবহার করে। এনএসডিট ব্যবহার করা আপনাকে কেবল দ্বিতীয় (গুলি) নির্ভুলতা পাবে। এই সংস্করণটি অটোরিলেজ এবং উদ্দেশ্য-সি জন্য বিশেষভাবে ডিজাইন করা হয়েছে। আমার প্রয়োজনে সি ++ সংস্করণও রয়েছে। আপনি সি ++ সংস্করণটি এখানে পাবেন

StopWatch.h

#import <Foundation/Foundation.h>


@interface StopWatch : NSObject 
{
    uint64_t _start;
    uint64_t _stop;
    uint64_t _elapsed;
}

-(void) Start;
-(void) Stop;
-(void) StopWithContext:(NSString*) context;
-(double) seconds;
-(NSString*) description;
+(StopWatch*) stopWatch;
-(StopWatch*) init;
@end

StopWatch.m

#import "StopWatch.h"
#include <mach/mach_time.h>

@implementation StopWatch

-(void) Start
{
    _stop = 0;
    _elapsed = 0;
    _start = mach_absolute_time();
}
-(void) Stop
{
    _stop = mach_absolute_time();   
    if(_stop > _start)
    {
        _elapsed = _stop - _start;
    }
    else 
    {
        _elapsed = 0;
    }
    _start = mach_absolute_time();
}

-(void) StopWithContext:(NSString*) context
{
    _stop = mach_absolute_time();   
    if(_stop > _start)
    {
        _elapsed = _stop - _start;
    }
    else 
    {
        _elapsed = 0;
    }
    NSLog([NSString stringWithFormat:@"[%@] Stopped at %f",context,[self seconds]]);

    _start = mach_absolute_time();
}


-(double) seconds
{
    if(_elapsed > 0)
    {
        uint64_t elapsedTimeNano = 0;

        mach_timebase_info_data_t timeBaseInfo;
        mach_timebase_info(&timeBaseInfo);
        elapsedTimeNano = _elapsed * timeBaseInfo.numer / timeBaseInfo.denom;
        double elapsedSeconds = elapsedTimeNano * 1.0E-9;
        return elapsedSeconds;
    }
    return 0.0;
}
-(NSString*) description
{
    return [NSString stringWithFormat:@"%f secs.",[self seconds]];
}
+(StopWatch*) stopWatch
{
    StopWatch* obj = [[[StopWatch alloc] init] autorelease];
    return obj;
}
-(StopWatch*) init
{
    [super   init];
    return self;
}

@end

শ্রেণীর একটি স্থিতিশীল stopWatchপদ্ধতি রয়েছে যা একটি স্বতঃস্ফূর্ত বিষয়টিকে ফেরত দেয়।

একবার আপনি কল করার পরে start, secondsসময় অতিবাহিত করার জন্য পদ্ধতিটি ব্যবহার করুন । startএটি পুনরায় চালু করতে আবার কল করুন । বা stopএটি বন্ধ করতে। কল করার secondsপরে আপনি যে কোনও সময় (কল ) পড়তে পারেন stop

একটি কার্যকারণে উদাহরণ (মৃত্যুর সময় নির্ধারণের কল)

-(void)SomeFunc
{
   StopWatch* stopWatch = [StopWatch stopWatch];
   [stopWatch Start];

   ... do stuff

   [stopWatch StopWithContext:[NSString stringWithFormat:@"Created %d Records",[records count]]];
}

আপনার "কেবলমাত্র সেকেন্ডের নির্ভুলতা" ভুল is যদিও কোনও এনএসটাইমআইন্টারভোলটির পুরো অংশটি সেকেন্ড, এটি দ্বিগুণ।
স্টিভেন ফিশার

3

আমি এই কোডটি ব্যবহার করি:

#import <mach/mach_time.h>

float TIME_BLOCK(NSString *key, void (^block)(void)) {
    mach_timebase_info_data_t info;
    if (mach_timebase_info(&info) != KERN_SUCCESS)
    {
        return -1.0;
    }

    uint64_t start = mach_absolute_time();
    block();
    uint64_t end = mach_absolute_time();
    uint64_t elapsed = end - start;

    uint64_t nanos = elapsed * info.numer / info.denom;
    float cost = (float)nanos / NSEC_PER_SEC;

    NSLog(@"key: %@ (%f ms)\n", key, cost * 1000);
    return cost;
}

2

আমি এটি ব্যবহার:

clock_t start, end;
double elapsed;
start = clock();

//Start code to time

//End code to time

end = clock();
elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
NSLog(@"Time: %f",elapsed);

তবে আমি আইফোনে CLOCKS_PER_SEC সম্পর্কে নিশ্চিত নই। আপনি এটি ছেড়ে দিতে চাইবেন।


2
আইফোনের CLOCKS_PER_SEC হ'ল একটি বদ্ধমূলভাবে ভুল মূল্য।
এমএক্সসিএল

1
জানা ভাল. আমি যদি এখন এটি করতে হয় তবে আমি ম্যাথিউয়ের উত্তরটি ব্যবহার করব।
ডেভিড কানারেক

2

mach_absolute_time()সুইফট 4 এ সূক্ষ্ম দানা বেঁধে দেওয়া সময়ের উদাহরণ :

let start = mach_absolute_time()

// do something

let elapsedMTU = mach_absolute_time() - start
var timebase = mach_timebase_info()
if mach_timebase_info(&timebase) == 0 {
    let elapsed = Double(elapsedMTU) * Double(timebase.numer) / Double(timebase.denom)
    print("render took \(elapsed)")
}
else {
    print("timebase error")
}

2

ঠিক আছে, যদি আপনার উদ্দেশ্যটি দ্রুততর করার জন্য আপনি কী ঠিক করতে পারেন তা খুঁজে বের করা, এটি কিছুটা ভিন্ন লক্ষ্য। ফাংশনগুলির সময় নির্ধারণ করা আপনার কোনও পার্থক্য করেছে কি না তা খুঁজে বের করার একটি ভাল উপায়, তবে আপনাকে কী করতে হবে তা জানার জন্য আলাদা কৌশল প্রয়োজন। এটি আমি পরামর্শ দিচ্ছি এবং আমি জানি আপনি এটি আইফোনে করতে পারেন।

সম্পাদনা: পর্যালোচকরা পরামর্শ দিয়েছিলেন যে আমি উত্তরটি আরও বিস্তৃত করব, তাই আমি এটি বলার জন্য একটি সংক্ষিপ্ত উপায়টি ভাবার চেষ্টা করছি।
আপনার সামগ্রিক প্রোগ্রামটি আপনাকে বিরক্ত করতে যথেষ্ট ঘড়ির সময় নেয়। ধরা যাক এটি এন সেকেন্ডের।
আপনি ধরে নিচ্ছেন আপনি এটিকে দ্রুত করতে পারবেন can আপনি কেবলমাত্র সেটাই করতে পারেন তা হ'ল সেই সময়ে এটি কিছু না করা, মি সেকেন্ডের জন্য অ্যাকাউন্টিং ।
আপনি প্রথমে জানেন না যে জিনিসটি কী। আপনি অনুমান করতে পারেন, সমস্ত প্রোগ্রামাররা যেমন করে তবে এটি সহজেই অন্যরকম কিছু হতে পারে। এটি যাই হোক না কেন, আপনি এটি এটি কীভাবে খুঁজে পেতে পারেন তা এখানে:

যেহেতু সেই জিনিসটি যাই হোক না কেন, সেই সময়ের ভগ্নাংশ এম / এন হিসাবে বিবেচিত হয়, এর অর্থ আপনি যদি এলোমেলোভাবে থামিয়ে দেন তবে সম্ভাবনা এম / এন হয় যে আপনি এই জিনিসটি করার জন্য এটি ধরবেন। অবশ্যই এটি অন্য কিছু করছে, তবে এটিকে বিরতি দিন এবং দেখুন এটি কী করছে।
এবার আবার কর। আপনি যদি আবার একই জিনিসটি করতে দেখেন তবে আপনি আরও সন্দেহজনক হতে পারেন।

এটি 10 ​​বার বা 20 করুন Now আপনি কতটা সময় গ্রহণ করেন তা মোটামুটিভাবে জানেন তবে কী ঠিক করতে হবে তা আপনি খুব জানেন ।
আপনিও যদি জানতে চান যে ঠিক কতটা সময় বাঁচবে তবে তা সহজ। আগে এটি পরিমাপ করুন, এটি ঠিক করুন এবং পরে এটি পরিমাপ করুন। আপনি যদি সত্যিই হতাশ হন তবে ঠিক করুন out

আপনি দেখতে পাচ্ছেন যে এটি মাপার থেকে কীভাবে আলাদা? এটি সন্ধান করছে, মাপছে না । সর্বাধিক প্রোফাইলিং যথাযথভাবে কতটা সময় নেওয়া হয় তা পরিমাপের উপর ভিত্তি করে, যেমনটি গুরুত্বপূর্ণ, এবং হ্যান্ড-ওয়েভগুলি কী ঠিক করা দরকার তা সনাক্ত করার সমস্যাটি তৈরি করে। প্রোফাইলিং প্রতিটি সমস্যা খুঁজে পায় না, তবে এই পদ্ধতিটি প্রতিটি সমস্যা সন্ধান করে এবং এটি এমন সমস্যা যা আপনি খুঁজে পান না যা আপনাকে আঘাত করে।


0

ডিফার কীওয়ার্ডটি ব্যবহার করে তা করার জন্য এখানে সুইফটে আরও একটি উপায় রয়েছে

func methodName() {
  let methodStart = Date()
  defer {
    let executionTime = Date().timeIntervalSince(methodStart)
    print("Execution time: \(executionTime)")
  }
  // do your stuff here
}

অ্যাপলের ডক্স থেকে : একটি ডিফার স্টেটমেন্টটি ডিফার স্টেটমেন্টের যে পরিমাণ সুযোগসীমাতে উপস্থিত হয় তার বাইরে প্রোগ্রাম নিয়ন্ত্রণ স্থানান্তর করার আগে কোড নির্বাহের জন্য ব্যবহৃত হয়।

এটি সম্পর্কিত কোডটি গোষ্ঠীভুক্ত করার সুবিধার্থে চেষ্টা / অবশেষে ব্লকের অনুরূপ।


0

আমি এটি আমার ইউটিস লাইব্রেরিতে ( সুইফট ৪.২ ) ব্যবহার করি:

public class PrintTimer {
    let start = Date()
    let name: String

    public init(file: String=#file, line: Int=#line, function: String=#function, name: String?=nil) {
        let file = file.split(separator: "/").last!
        self.name = name ?? "\(file):\(line) - \(function)"
    }

    public func done() {
        let end = Date()
        print("\(self.name) took \((end.timeIntervalSinceReferenceDate - self.start.timeIntervalSinceReferenceDate).roundToSigFigs(5)) s.")
    }
}

... তারপরে এমন পদ্ধতিতে কল করুন:

func myFunctionCall() {
    let timer = PrintTimer()
    // ...
    timer.done()
}

... যা চলার পরে কনসোলে এটির মতো দেখাচ্ছে:

MyFile.swift:225 - myFunctionCall() took 1.8623 s.

উপরের টিক / টকের মতো সংক্ষিপ্ত নয়, তবে এটি কী করছে তা দেখার পক্ষে যথেষ্ট স্পষ্ট এবং স্বয়ংক্রিয়ভাবে কী কী সময় নির্ধারিত হচ্ছে তা অন্তর্ভুক্ত রয়েছে (ফাইলের মাধ্যমে, পদ্ধতিটির শুরুতে লাইন এবং ফাংশন নাম)। স্পষ্টতই যদি আমি আরও বিশদ জানতে চাই (উদাহরণস্বরূপ, যদি আমি কেবল কোনও সাধারন ক্ষেত্রে যেমন কোনও মেথড কলের সময়সূচি না রাখি তবে পরিবর্তে সেই পদ্ধতির মধ্যে একটি ব্লকের সময় নির্ধারণ করি) তবে আমি মুদ্রণটাইম আর আই-তে "নাম =" ফু "" পরামিতি যুক্ত করতে পারি এটি ডিফল্ট ছাড়াও কিছু নামকরণ করা।


-1

যেহেতু আপনি কোনও ইউআইবিউভিউতে একটি পৃষ্ঠা থেকে অন্য পৃষ্ঠায় যাওয়ার সময়কে অনুকূলিত করতে চান, তার অর্থ এই নয় যে আপনি এই পৃষ্ঠাগুলি লোড করার ক্ষেত্রে ব্যবহৃত জাভাস্ক্রিপ্টকে সত্যিই অনুকূলিত করছেন?

সে লক্ষ্যে আমি এখানে ওয়েবকিট প্রোফাইলারের দিকে তাকিয়েছিলাম about

http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/

আরেকটি পদ্ধতি হ'ল উচ্চ স্তরে শুরু করা এবং আপনি একবারে পুরো ওয়েবভিউ রিফ্রেশ করার পরিবর্তে এজেএক্স শৈলীর পৃষ্ঠা লোডিংয়ের সাহায্যে লোড সময়কে হ্রাস করার প্রশ্নে ওয়েব পৃষ্ঠাগুলি কীভাবে ডিজাইন করতে পারেন তা ভাবুন।


-1
struct TIME {

    static var ti = mach_timebase_info()
    static var k: Double = 1
    static var mach_stamp: Double {

        if ti.denom == 0 {
            mach_timebase_info(&ti)
            k = Double(ti.numer) / Double(ti.denom) * 1e-6
        }
        return Double(mach_absolute_time()) * k
    }
    static var stamp: Double { return NSDate.timeIntervalSinceReferenceDate() * 1000 }
}

do {
    let mach_start = TIME.mach_stamp
    usleep(200000)
    let mach_diff = TIME.mach_stamp - mach_start

    let start = TIME.stamp
    usleep(200000)
    let diff = TIME.stamp - start

    print(mach_diff, diff)
}

-1

দীর্ঘ চলমান প্রক্রিয়াটি খুঁজে পেতে কোথাও দ্বিখণ্ডিত কোডের জন্য এখানে একটি সুইফ্ট 3 সমাধান রয়েছে's

var increment: Int = 0

var incrementTime = NSDate()

struct Instrumentation {
    var title: String
    var point: Int
    var elapsedTime: Double

    init(_ title: String, _ point: Int, _ elapsedTime: Double) {
        self.title = title
        self.point = point
        self.elapsedTime = elapsedTime
    }
}

var elapsedTimes = [Instrumentation]()

func instrument(_ title: String) {
    increment += 1
    let incrementedTime = -incrementTime.timeIntervalSinceNow
    let newPoint = Instrumentation(title, increment, incrementedTime)
    elapsedTimes.append(newPoint)
    incrementTime = NSDate()
}

ব্যবহার: -

instrument("View Did Appear")

print("ELAPSED TIMES \(elapsedTimes)")

নমুনা আউটপুট: -

এলপাসড টাইমস [মাইএপ.সোমভিউ কনট্রোলার.আইনসিসমেন্টেশন (শিরোনাম: "শুরু দেখুন কি লোড হয়েছে", পয়েন্ট: 1, এলপসডটাইম: 0.040504038333892822), মাইএপ.সোমভিউ কনট্রোলার.আইনজিমেন্টেশন (শিরোনাম: "সাবভিউগুলি যোগ করা শেষ হয়েছে", টাইপ: ২0০১০, ১০০১০, ১১১০ মাইএপ.সোমভিউকন্ট্রোলআরআইনসিমেন্টেশন (শিরোনাম: "দেখুন কি দেখা গেল", পয়েন্ট: 3, এলপসডটাইম: 0.56564098596572876)]


-1

অনেক উত্তর অদ্ভুত এবং সত্যিই মিলিসেকেন্ডে ফলাফল দেয় না (তবে সেকেন্ডে বা অন্য কোনও কিছুতে):

আমি এমএস (মিলিসেকেন্ডস) পেতে কী ব্যবহার করি তা এখানে:

সুইফট:

let startTime = NSDate().timeIntervalSince1970 * 1000

// your Swift code

let endTimeMinusStartTime = NSDate().timeIntervalSince1970 * 1000 - startTime
print("time code execution \(endTimeMinStartTime) ms")

উদ্দেশ্য গ:

double startTime = [[NSDate date] timeIntervalSince1970] * 1000.0;

// your Objective-C code

double endTimeMinusStartTime = [[NSDate date] timeIntervalSince1970] * 1000.0 - startTime;
printf("time code execution %f ms\n", endTimeMinusStartTime );

-1

সুইফ্ট 4 এর জন্য, আপনার শ্রেণিতে একজন প্রতিনিধি হিসাবে যুক্ত করুন:

public protocol TimingDelegate: class {
    var _TICK: Date?{ get set }
}

extension TimingDelegate {
    var TICK: Date {
        _TICK = Date()
        return(_TICK)!
     }

    func TOCK(message: String)  {

        if (_TICK == nil){
            print("Call 'TICK' first!")
        }

        if (message == ""){
            print("\(Date().timeIntervalSince(_TICK!))")
        }
        else{
            print("\(message): \(Date().timeIntervalSince(_TICK!))")
        }
    }
}

আমাদের ক্লাসে যুক্ত করুন:

class MyViewcontroller: UIViewController, TimingDelegate

তারপরে আপনার ক্লাসে যুক্ত করুন:

var _TICK: Date?

আপনি যখন কিছু সময় দিতে চান, তখন এটি দিয়ে শুরু করুন:

TICK

এবং এর সাথে শেষ:

TOCK("Timing the XXX routine")

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