When String.prototype.concat() and String.prototype.join() have not been modified from their initial values, promotion of their arguments to strings and concatenation of those strings should be nearly as fast as the '+' operator with one string operand (which also has to promote the other operand). This will allow functional composition to be performant. See https://jsperf.com/concat-vs-plus-vs-join-2
<rdar://problem/43646782>
It looks like you are seeing such a large difference because the test is passing more than one argument to concat at the same time. This causes us to emit a loop which is slowing that code down. If you change your test to: string1.concat(string2).concat(string3); you will see that the perf is quite close. In theory we could do some loop unrolling to fix this but the same issue applies to calling the '+' operator in a loop. The join case is slow because it will allocate an Array, which is expensive. We could also optimize this but it's probably easier to use the concat method for now.