performance improvement: use concat instead of StringBuilder