Index: src/benchmark/Makefile.am
===================================================================
--- src/benchmark/Makefile.am	(revision ac93b2287119108108d39026a0f27c1c260ea646)
+++ src/benchmark/Makefile.am	(revision cf95f94f6600f5ccbc0fb79d4fcfb3c90e840a7a)
@@ -44,2 +44,6 @@
 	@rm -f ./a.out
 
+csv-data:
+	@${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -quiet -DN=10000000 csv-data.c
+	@./a.out
+	@rm -f ./a.out
Index: src/benchmark/Makefile.in
===================================================================
--- src/benchmark/Makefile.in	(revision ac93b2287119108108d39026a0f27c1c260ea646)
+++ src/benchmark/Makefile.in	(revision cf95f94f6600f5ccbc0fb79d4fcfb3c90e840a7a)
@@ -491,4 +491,9 @@
 	@rm -f ./a.out
 
+csv-data:
+	@${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -quiet -DN=10000000 csv-data.c
+	@./a.out
+	@rm -f ./a.out
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
Index: src/benchmark/csv-data.c
===================================================================
--- src/benchmark/csv-data.c	(revision cf95f94f6600f5ccbc0fb79d4fcfb3c90e840a7a)
+++ src/benchmark/csv-data.c	(revision cf95f94f6600f5ccbc0fb79d4fcfb3c90e840a7a)
@@ -0,0 +1,87 @@
+#include <fstream>
+#include <stdlib>
+#include <threads>
+
+#include <unistd.h>					// sysconf
+#include <sys/times.h>					// times
+#include <time.h>
+
+inline unsigned long long int Time() {
+    timespec ts;
+    clock_gettime(
+#if defined( __linux__ )
+	 CLOCK_THREAD_CPUTIME_ID,
+#elif defined( __freebsd__ )
+	 CLOCK_PROF,
+#elif defined( __solaris__ )
+	 CLOCK_HIGHRES,
+#else
+    #error uC++ : internal error, unsupported architecture
+#endif
+	 &ts );
+    return 1000000000LL * ts.tv_sec + ts.tv_nsec;
+} // Time
+
+struct GreatSuspender {
+	coroutine c;
+};
+
+DECL_COROUTINE(GreatSuspender);
+
+void ?{}( GreatSuspender * this ) {
+	prime(this);
+}
+
+void main( GreatSuspender * this )
+{
+	while( true ) {
+		suspend();
+	}
+}
+
+void resumer( GreatSuspender * this, const unsigned int NoOfTimes ) {
+	for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {
+		resume( this );
+	}
+}
+
+#ifndef N
+#define N 100000000
+#endif
+
+
+
+long long int measure_coroutine() {
+	const unsigned int NoOfTimes = N;
+	long long int StartTime, EndTime;
+
+	GreatSuspender s;
+
+	StartTime = Time();
+	// for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {
+	// 	resume( this_coroutine() );
+	// 	// resume( &s );
+	// }
+	resumer( &s, NoOfTimes );
+	EndTime = Time();
+
+	return ( EndTime - StartTime ) / NoOfTimes;
+}
+
+long long int measure_thread() {
+	const unsigned int NoOfTimes = N;
+	long long int StartTime, EndTime;
+
+	StartTime = Time();
+	for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {
+		yield();
+	}
+	EndTime = Time();
+
+	return ( EndTime - StartTime ) / NoOfTimes;
+}
+
+int main()
+{
+	sout | time(NULL) | "," | measure_coroutine() | "," | measure_thread() | endl;
+}
