2

AppSettingsControllerいくつかのメソッドで名前が付けられたシングルトン クラスがあります。

一般的に、私はそれらを次のように呼びます。

[[AppSettingsController sharedInstance] myMethod];

そして、それは問題ありません。

インスタンスの作成方法は次のとおりです。

+ (id)sharedInstance
{
    static AppSettingsController *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

しかし、私は別のことを検討しています。ループで myMethod を呼び出す必要があるとしましょう。このシングルトンのローカル変数を作成し、この変数でこのメソッドを呼び出すほうがよいのではないでしょうか?

AppSettingsController *mySharedInstance = [AppSettingsController sharedInstance];
loop
  [mySharedInstance myMethod];

...直接呼び出す代わりに?

loop
  [[AppSettingsController sharedInstance] myMethod];

どちらの方法がより効率的ですか、または両方とも等しいですか?

4

4 に答える 4

3

[[AppSettingsController sharedInstance] myMethod];コードはループ内で2つのメソッドを呼び出します

AppSettingsController * mySharedInstance = [AppSettingsController sharedInstance];
ループ
[mySharedInstancemyMethod];

1つだけを呼び出します

ここで2番目のケースでは、単一のメソッド呼び出しを保存しているため、2番目のメソッドの方が効率的です。また、メソッドでさらに多くのメソッド呼び出しといくつかの初期化ステートメントsharedInstanceを言っ4ている場合、その場合はその呼び出しと初期化ステートメントも保存しています。


アップデート

sudoアセンブリコードの記述(Sudoアセンブラ:Pを使用)。正確なアセンブリコードを使用しないという考えを理解してください

Case 1:
Loop start:
1 Call method sharedInstance

  [this code step 2-7 will be called only once]
  2 Create a static AppSettingsController *sharedInstance = nil; in sharedInstance method
  3 Create static dispatch_once_t onceToken;
  4 Call dispatch_once
  5 Now dispatch_once takes lock of onceToken (and other task which is not visible for me)
  6 Call [self alloc]
  7 Call [self init]

8 Return from sharedInstance
9 Call myMethod
Loop ends:




Case 2:
1 Call method sharedInstance
2 Create a static AppSettingsController *sharedInstance = nil; in sharedInstance method
3 Create static dispatch_once_t onceToken;
4 Call dispatch_once
5 Now dispatch_once takes lock of onceToken (and other task which is not visible for me)
6 Call [self alloc]
7 Call [self init]
8 Return from sharedInstance
9 Assign sharedInstance value to mySharedInstance variable
Loop starts:
10 Call myMethod
Loop Ends:

ここではっきりとあなたはあなたが何を節約しているかを見ることができます

于 2013-02-21T14:32:02.767 に答える
2

IMHO これはほとんどの場合の理論的な議論です。ループの前にローカル変数を設定するために 1 回だけアクセスするのではなく、ループ内で毎回 sharedInstance にアクセスする場合、1 レベル以上の間接化によるパフォーマンスへの影響は感じられません。

あなたが最も好きなバージョンを使用してください(読みやすさの観点から)、またはパフォーマンスヒットを気にする場合は、ローカル変数の方法を使用してください。

于 2013-02-21T15:22:04.183 に答える
1

私の意見では、あなたが最初にすることの方が良いです:

[[AppSettingsController sharedInstance] myMethod];

インスタンスを必要としないため、シングルトンです。したがって、最初の方法の方が優れています。インスタンスを作成すると、直接呼び出しよりも多くのメモリを使用できると思いますが、これについてはよくわかりません。

于 2013-02-21T14:29:51.953 に答える
1

2回目の電話に行く

[[AppSettingsController sharedInstance] myMethod];

この方法は世界で使用されており、読みやすくなっています。

于 2013-02-21T14:33:39.497 に答える