4

In Objective-C, the method stringWithFormat: seems to be extremely slow and is actually a large bottleneck in one of our apps (we used the profiler to find that out). Is there a way to optimise it or use some faster C code?

Stephen Melvin
  • 3,696
  • 2
  • 27
  • 40
AJ222
  • 1,114
  • 2
  • 18
  • 40
  • 11
    How could we know without seeing any of your code? – DrummerB Nov 26 '12 at 16:21
  • I am not talking about a specific code. i am talking about the line [NSString stringWithFormat] – AJ222 Nov 26 '12 at 16:22
  • How do you identify it as bottle neck of your app? – nhahtdh Nov 26 '12 at 16:24
  • What do you mean by 'bottleneck'? Does it consume too much CPU? Does it make UI slow? Maybe you could relocate those calls away from main thread. – ZhangChn Nov 26 '12 at 16:25
  • 4
    Interpreting a format string is inherently slow. If you can used other techniques, and performance is an issue, then go ahead. (And, for crying out loud, don't use things like `myString = [NSString stringWithFormat:@"%@", "ABC"];` as I've seen many times here. It's totally wasted motion!) – Hot Licks Nov 26 '12 at 16:25
  • 3
    You don't use retarded code like `NSString *str = [NSString stringWithFormat:@"%@", otherString];` do you? I've seen plenty of examples of that on stackoverflow... – trojanfoe Nov 26 '12 at 16:25
  • 1
    @HotLicks great minds... – trojanfoe Nov 26 '12 at 16:27
  • 1
    (Give us two or three examples of your use of stringWithFormat.) – Hot Licks Nov 26 '12 at 16:29
  • What do you mean by "use some faster C code"? Also, your question is nearly impossible to answer without code. We need to see how you are using stringWithFormat. – Stephen Melvin Nov 26 '12 at 17:04
  • I simply use it for string concatanation – AJ222 Nov 27 '12 at 09:42
  • @DrummerB your comment in most cases would be reasonable, but it seems that NSString stringWithFormat is *always* very slow, irrespective of the circumstances, which makes the question valid. With the help of this question, I did some experiments, and it's *always* sped up considerably by using sprintf. If you're doing any kind of rendering using strings for texture names, render path dictionaries, etc ... a 500% improvement in string concatenation speed (5x faster is typical when using sprintf) is a big thing :). – Adam Jul 02 '13 at 18:18

2 Answers2

8

Yes use sprintf in c http://www.cplusplus.com/reference/cstdio/sprintf/ after that push the char* in a NSString with [NSString stringWithUTF8:];

example:

char cString[255];
sprintf (cString, "%d", 36);
NSString* OCstring = [[NSString alloc] initWithUTF8String:cString];
JMBise
  • 680
  • 4
  • 19
  • Looking for a general-purpose drop-in replacement for stringWithFormat... harder than it looks! – SG1 Dec 21 '12 at 20:58
  • @JMBise Do i need to release the char array afterwards ? – Danpe Oct 14 '13 at 03:09
  • @Danpe No, you don't need to release the char array, because it's not a pointer. It will be automatically released at the end of the function(if it is inside a function) or after each run of the loop(if it is inside in loop) – JMBise Oct 14 '13 at 12:24
6

If you're doing extensive string manipulations and operations - it sounds like you might well be doing so, and NSString really is becoming a bottleneck for your app, I recommend trying to use C++ for your string needs rather then C.

Apple admits that while NSString is great, it is top level, in fact, to make their autocorrect algorithm's for iOS they ran into a similar problem, NSString was too slow to compute and compare so many things. They then switched to C++ and got all the performance they needed.

Just a suggestion. You should definitely put up some code, I am surprised this is happening to you unless you're doing some awesome new feature !

Daniel
  • 23,129
  • 12
  • 109
  • 154