Yah you also need to consider things like cache access, if two threads are competing for memory time and are accessing it quite randomly to get the string data, that's going to be less efficient than when one thread is just going through contiguous memory.
I did personally notice some general slowdown when using a threaded version of an app. One thing to consider also is that although you may now be using 2 or more cpu cores, they still have to *share* the same memory bus. You aren't getting twice the performance in memory accesses. You could throw 16 cores at it but if they're all accessing the same memory each thread will be held up by memory accesses. I would also think that if you are doing operations that entail a lot of memory access - like working with strings, then memory is going to become a bottleneck and the cpu is going to be kept waiting. Also if the cpu's have to share the memory bus one is going to have to stall while the other one has bus access.
This is partly why the Cell processor gives local memory to each individual cpu core so they don't have to share bus accesses.
I did personally notice some general slowdown when using a threaded version of an app. One thing to consider also is that although you may now be using 2 or more cpu cores, they still have to *share* the same memory bus. You aren't getting twice the performance in memory accesses. You could throw 16 cores at it but if they're all accessing the same memory each thread will be held up by memory accesses. I would also think that if you are doing operations that entail a lot of memory access - like working with strings, then memory is going to become a bottleneck and the cpu is going to be kept waiting. Also if the cpu's have to share the memory bus one is going to have to stall while the other one has bus access.
This is partly why the Cell processor gives local memory to each individual cpu core so they don't have to share bus accesses.