stringByAppendingString: vs. stringWithFormat:

  • Ich überarbeite einen Code, der viele Zeilen von NSString* image = [@"ipad_" stringByAppendingString:imageOrigName]; enthält, und wundert mich, welcher optimierter ist:

     stringByAppendingString:
     

    oder

     stringWithFormat:
     

    Im ersten Objekt nehmen Sie ein NSString -Objekt und verketten es ein anderes auf seinen Schwanz. Im zweiten können Sie einen Formatierer verwenden:

     NSString* image = [NSString stringWithFormat:@"ipad_%@", imageOrigName];
     

    Das Ergebnis ist dasselbe, jedoch zu Optimierungszwecken Was ist besser?

    Für das obige Beispiel würde ich erwarten, dass eine einfache Verkettung schneller wäre, als wenn die Zeichenfolge nach "%" -Symbolen durchsucht wird. Suchen Sie einen passenden Typ (NSString für die %@) und den gesamten Hintergrund für Voodoo.

    Was passiert jedoch, wenn wir (schlampig geschriebenen?) Code haben, der mehrere stringByAppendingString s enthält?

     NSString* remainingStr = [NSString stringWithFormat:@"%d", remaining];
    NSString* msg = "You have ";
    msg = [msg stringByAppendingString:remainingStr];
    msg = [msg stringByAppendingString:@" left to go!"];
    if (remaining == 0)
        msg = [msg stringByAppendingString:@"Excellent Job!"];
    else
        msg = [msg stringByAppendingString:@"Keep going!"];
     

    Hier scheint ein einzelner stringWithFormat (oder initWithFormat, wenn wir [NSString alloc] verwenden) Der intelligentere Weg:

     NSString* encouragementStr = (remaining == 0 ? @"Excellent Job!" : @"Keep going!");
    NSString* msg = [NSString stringWithFormat:@"You have %d left to go! %@", remaining, encouragementStr];
     

    Gedanken? Sites / Blogs, die Sie gefunden haben und die das beantworten helfen?

    30 November 2011
    Mac
2 answers
  • Der einzige Weg zu wissen ist, es zu messen.

    Natürlich ist der einzige Grund, es zu messen, ob es wirklich wichtig ist; Wenn Sie ein reales Leistungsproblem haben, das mit diesem Code verfolgt werden kann.

    Wenn nicht, machen Sie sich keine Sorgen.

    Es gibt jedoch ein paar Punkte, die zu berücksichtigen sind:

    • Jedes append* führt zu einer Zuordnung und zum Kopieren von Speicher, diese sind teuer.
    • Jedes *WithFormat: führt dazu, dass eine Zeichenfolge analysiert wird (und Zuweisungen / Kopieren erfolgen).
    • All dies ist wahrscheinlich völlig irrelevant, sofern Sie es nicht sind dies oft 10-tausend mal. Wenn Sie es sind, stellt sich die Frage, warum?

    Schließlich ist zu beachten, dass diese Art der String-Manipulation die Lokalisierung schwieriger macht .

    09 March 2013
    hourback
  • Sie sollten die beiden Methoden miteinander vergleichen, um zu sehen, welche schneller ist. Beispiel:

     double startTime1 = CACurrentMediaTime() / CLOCKS_PER_SEC;
    
    NSString* testString1 = [@"fragmentOne" stringByAppendingString: @"fragmentTwo"];
    
    double endTime1 = CACurrentMediaTime() / CLOCKS_PER_SEC;
    
    
    double startTime2 = CACurrentMediaTime() / CLOCKS_PER_SEC;
    
    NSString* testString2 = [NSString stringWithFormat: @"fragmentOne%@", @"fragmentTwo"];
    
    double endTime2 = CACurrentMediaTime() / CLOCKS_PER_SEC;
    
    
    double diff1 = (endTime1 - startTime1) * 1000000000000000;
    double diff2 = (endTime2 - startTime2) * 1000000000000000;
    
    NSLog(@"stringByAppendingString time: %f", diff1);
    NSLog(@"stringWithFormat time: %f", diff2);
     

    Ich hätte den Test wahrscheinlich selbst in der Zeit laufen lassen können, in der ich das geschrieben habe, aber Wie auch immer, jetzt wissen Sie, wie Sie Methoden bewerten können :) Wenn ich es wäre, würde ich stringWithFormat verwenden, da dies für mehr lesbaren Code sorgt.

    Hoffe das hilft!

    30 November 2011