You picked the single slowest way to do it. Please see https://gist.github.com/wyager/df063ad4edd9a9c8b0ab762c91a79894
All times are on my Intel Atom Macbook. Compiled with -O3, no other options.
Using Lazy Bytestrings (either through the Builder interface or plain old concatenation) is about 7-7.5 times faster than string concatenation so on your computer it should take about 0.12 seconds. In other words, faster than C.
This is my usual experience with lazy bytestrings; due to their optimization for cache size, they are extremely fast with almost no effort. They often out-perform "fast" array operations in C due to fusion and cache coherency.
I will note that if you want to do exactly what C does (often with only slightly different assembly output), you can often achieve this with unboxed vectors (mutable or immutable, depending on your application).
--Will