views:

96

answers:

7

In java they say don't concatenate Strings, instead you should make a stringbuffer and keep adding to that and then when you're all done, use toString() to get a String object out of it. Here's what I don't get. They say do this for performance reasons, because concatenating strings makes lots of temporary objects. But if the goal was performance, then you'd use a language like C/C++ or assembly.

The argument for using java is that it is a lot cheaper to buy a faster processor than it is to pay a senior programmer to write fast efficient code. So on the one hand, you're supposed let the hardware take care of the inefficiencies, but on the other hand, you're supposed to use stringbuffers to make java more efficient.

While I see that you can do both, use java and stringbuffers, my question is where is the flaw in the logic that you either use a faster chip or you spent extra time writing more efficient software.

A: 

You should always put optimizations where you can. You shouldn't be "lazy coding" just because you have a fast processor...

I don't really know how stringbuffer works, nor do i work with Java, but assuming that java defines a string as char[], you're allocating a ton of dummy strings when doing str1+str2+str3+str4+str5, where you really only need to make a string of length str1.length+...str5.length and copy everything ONCE...

However, a smart compiler would optimize and automatically use stringbuffer

ItzWarty
+4  A: 

The argument that you should use StringBuffer rather than concatenation is an old java cargo-cult myth. The Java compiler itself will convert a series of concatenations into a single StringBuffer call, making this "optimization" completely unnecessary in source code.

Having said that, there are legitimate reasons to optimize even if you're using a "slow" bytecode or interpreted language. You don't want to deal with the bugs, instability, and longer development cycle of C/C++, so you use a language with richer capabilities. (Built-in strings, whee!) But at the same time, you want your code to run as fast as possible with that language, so you avoid obviously inefficient constructs. IOWs just because you're giving up some speed by using java doesn't mean that you should forget about performance entirely.

JSBangs
Really? Citation or link needed for the compiler conversion of strings to StringBuffer calls because I never heard of or read it.
Spoike
http://forums.sun.com/thread.jspa?threadID=5210952
Jim Kiley
+5  A: 

Developers should understand the performance implications of their coding choices.

It's not terribly difficult to write an algorithm that results in non-linear performance - polynomial, exponential or worse. If you don't understand to some extent how the language, compiler, and libraries support your algorithm you can fall into trap that no amount of processing power will dig you out of. Algorithms whose runtime or memory usage is exponential can quickly exceed the ability of any hardware to execute in a reasonable time.

Assuming that hardware can scale to a poorly designed algorithm/coding choice is a bad idea. Take for example a loop that concatenates 100,000 small strings together (say into an XML message). This is not an uncommon situation - but when implementing using individual string concatenations (rather than a StringBuffer) this will result in 99,999 intermediate strings of increasing size that the garbage collector has to dispose of. This can easily make the operation fail if there's not enough memory - or at best just take forever to run.

Now in the above example, some Java compilers can usually (but not always) rewrite the code to use a StringBuffer behind the scenes - but this is the exception, not the rule. In many situations the compiler simply cannot infer the intent of the developer - and it becomes the developer's responsibility to write efficient code.

One last comment - writing efficient code does not mean spending all your time looking for micro-optimizations. Premature optimization is the enemy of writing good code. However, you shouldn't confuse premature optimization with understanding the O() performance of an algorithm in terms of time/storage and making good choices about which algorithm or design to use in which situation.

As a developer you cannot ignore this level of knowledge and just assume that you can always throw more hardware at it.

LBushkin
+3  A: 

The difference is that StringBuffer is not at all harder or more time-consuming to use than concatenating strings. The general principle is that if it's possible to gain efficiency without increasing development time/difficulty, it should be done: your principle only applies when that's not possible.

tloflin
+1  A: 

Java != ineffecient code.

You do not buy a faster processor to avoid writing efficient code. A bad programmer will write bad code regardless of language. The argument that C/C++ is more efficient than Java is an old argument that does not matter anymore.

Vincent Ramdhanie
"The argument that C/C++ is more efficient than Java is an old argument that does not matter anymore." You seriously need to qualify that statement. C/C++'s efficiency *does* matter in many domains.
carl
@cvondrick ok. It does not matter in the environment where you think it is ok to buy faster CPU rather than write more efficient code. That is, most business applications are not going to notice any performance issues with Java.
Vincent Ramdhanie
+2  A: 

The language being slower isn't an excuse to use a much slower algorithm (and Java isn't that slow these days).

If we concatenate a 1-character to an n-character string, we need to copy n+1 characters into the new string. If we do

string s;
for (int i = 0; i < N; ++ i)
  s = s + "c";

then the running time will be O(N2).

By contrast, a string buffer maintain a mutable buffer which reduces the running time to O(N).

You cannot double the CPU to reduce a quadratic algorithm into a linear one.

(Although the optimizer may have implicitly created a StringBuffer for you already.)

KennyTM
+1  A: 

In the real world, programming languages, operating systems and developpement tools are not selected by the peoples who will actually deal with it.

Some salesman of company A have lunch with your boss to sell its operating system ... and then some other salesman invite your boss at the strippers to sell its database engine ... and so on.

Then, and only then, they hire a bunch of programmers to put all that together. They want it nice, fast and cheap.

That's why you may end up programming high end performance applications with Java on a mobile device or nice 3D graphics on Windows with Python ...

So, your right, but it doesn't matter. :)

Basbrun
Ahh realism, how dare you bring that up in such an abstract discussion!?!? :-)
stu
Ah ah ... right. It's fun to see how eternal are these discussions. We had the same debate between C and C++ a "few" years ago and now both are together in the C/C++ bag to fight their place in the heart of developers. Time flies!
Basbrun