Index: tests/zombies/string-perf/.gitignore
===================================================================
--- tests/zombies/string-perf/.gitignore	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/.gitignore	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,2 @@
+!Makefile
+perfexp-*
Index: tests/zombies/string-perf/Makefile
===================================================================
--- tests/zombies/string-perf/Makefile	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/Makefile	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,91 @@
+
+CFABUILD = ~/cfa2/build-perf
+LIBCFA = $(CFABUILD)/libcfa/*/src/.libs/libcfa.so
+
+CFA = $(CFABUILD)/driver/cfa
+PERFFLAGS_CFA = -nodebug -O2
+PERFFLAGS_CXX = -DNDEBUG -O2
+
+#PERFPROGS can include this one, but it's 10x slower than its peers
+#	perfexp-cfa-hl-pta-noshare \
+
+PERFPROGS = \
+	perfexp-cfa-hl-pta-share \
+	perfexp-cfa-hl-peq-share \
+	perfexp-cfa-ll-pta-share \
+	perfexp-cfa-ll-peq-share \
+	perfexp-cfa-hl-peq-noshare \
+	perfexp-cfa-ll-pta-noshare \
+	perfexp-cfa-ll-peq-noshare \
+	perfexp-stl-pta \
+	perfexp-stl-peq \
+	perfexp-buhr94-pta \
+	perfexp-buhr94-peq
+
+all : $(PERFPROGS)
+
+perfexp-cfa-hl-pta-share : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_HL_SHARE -DOP_PLUS_THEN_ASSIGN
+
+perfexp-cfa-hl-peq-share : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_HL_SHARE -DOP_PLUSEQ
+
+perfexp-cfa-ll-pta-share : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_LL_SHARE -DOP_PLUS_THEN_ASSIGN
+
+perfexp-cfa-ll-peq-share : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_LL_SHARE -DOP_PLUSEQ
+
+perfexp-cfa-hl-pta-noshare : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_HL_NOSHARE -DOP_PLUS_THEN_ASSIGN
+
+perfexp-cfa-hl-peq-noshare : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_HL_NOSHARE -DOP_PLUSEQ
+
+perfexp-cfa-ll-pta-noshare : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_LL_NOSHARE -DOP_PLUS_THEN_ASSIGN
+
+perfexp-cfa-ll-peq-noshare : prog.cfa $(LIBCFA)
+	$(CFA) $(PERFFLAGS_CFA) $^ -o $@ -DIMPL_CFA_LL_NOSHARE -DOP_PLUSEQ
+
+perfexp-stl-pta : prog.cfa
+	$(CXX) -xc++ $(PERFFLAGS_CXX) $^ -o $@ -DIMPL_STL -DOP_PLUS_THEN_ASSIGN
+
+perfexp-stl-peq : prog.cfa
+	$(CXX) -xc++ $(PERFFLAGS_CXX) $^ -o $@ -DIMPL_STL -DOP_PLUSEQ
+
+perfexp-buhr94-pta.o : prog.cfa
+	$(CXX) -xc++ -c $(PERFFLAGS_CXX) $^ -o $@ -DIMPL_BUHR94 -DOP_PLUS_THEN_ASSIGN
+
+perfexp-buhr94-peq.o : prog.cfa
+	$(CXX) -xc++ -c $(PERFFLAGS_CXX) $^ -o $@ -DIMPL_BUHR94 -DOP_PLUSEQ
+
+buhr94-string.o:
+	$(CXX) -xc++ -c $(PERFFLAGS_CXX) ~/usys1/sm/string/StringSharing/src/string.cc -o $@
+
+buhr94-VbyteSM.o:
+	$(CXX) -xc++ -c $(PERFFLAGS_CXX) ~/usys1/sm/string/StringSharing/src/VbyteSM.cc -o $@
+
+perfexp-buhr94-pta : perfexp-buhr94-pta.o buhr94-string.o buhr94-VbyteSM.o
+	$(CXX) $(PERFFLAGS_CXX) $^ -o $@
+
+perfexp-buhr94-peq : perfexp-buhr94-peq.o buhr94-string.o buhr94-VbyteSM.o
+	$(CXX) $(PERFFLAGS_CXX) $^ -o $@
+
+clean:
+	rm -f *.o perfexp*
+
+MEASURE = $(PERFPROGS)
+CORPORI = ../corpus-100-*-1.txt
+
+measurment: $(MEASURE)
+	tofile=measurement-`date '+%F--%H-%M-%S'`.csv ; \
+	echo $$tofile ; \
+	for prog in $(MEASURE) ; do \
+	    for corpus in $(CORPORI) ; do \
+			corpusbody=`cat $$corpus` ; \
+			printed=`./$$prog $$corpusbody` ; \
+			echo $$prog,$$corpus,$$printed  >>  $$tofile ; \
+		done ; \
+	done ; \
+	cat $$tofile
Index: tests/zombies/string-perf/corpus-100-1-1.txt
===================================================================
--- tests/zombies/string-perf/corpus-100-1-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-100-1-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,100 @@
+t
+w
+m
+k
+b
+n
+x
+n
+a
+s
+g
+f
+a
+g
+p
+l
+b
+l
+g
+f
+f
+i
+n
+q
+l
+t
+k
+p
+g
+p
+o
+j
+p
+e
+t
+i
+f
+h
+r
+k
+l
+w
+f
+j
+m
+o
+g
+s
+w
+t
+j
+u
+v
+n
+g
+s
+h
+r
+g
+g
+g
+t
+v
+k
+o
+m
+j
+r
+m
+x
+j
+o
+m
+i
+n
+n
+k
+i
+x
+c
+b
+o
+v
+v
+q
+g
+r
+t
+d
+y
+t
+m
+v
+o
+t
+i
+h
+i
+h
+r
Index: tests/zombies/string-perf/corpus-100-10-1.txt
===================================================================
--- tests/zombies/string-perf/corpus-100-10-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-100-10-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,100 @@
+arffxh
+qx
+fbfnvxvw
+ktcfgonnoklj
+eqqe
+ywvjewor
+pqrqdnuj
+kyjbjvmwcdpibqfyam
+rgshymadcvmxilijw
+vvkb
+secaddobw
+veuk
+ama
+k
+autadrvnukiymlerahoxduvnava
+ln
+ni
+nme
+cywlbjwfe
+nsxqqthqrj
+dwk
+iwhw
+t
+cskdfjljlyej
+ufynwlldivusu
+pxbpdtcgy
+tkasrjlmqmdnxosjmpckusivilr
+utboebivmv
+diotjfms
+dueapnvabpnvjo
+osv
+ftal
+ofnvtgqyewytkwwmnkkwbxnvtdcndpsuwisqrj
+vhrrtpoifbtefruboafeduwargtjxfcvovplnhtu
+pankwp
+wufcsfdklyvlga
+vwyjmgfirxkfihwl
+uqinvnajmwutygrxgbloivgggmqplcvitevps
+chvydugutmxhbjdipjwhyk
+utdbrvtq
+e
+whmdfgrfpv
+sgfedmfpxaje
+ecawaemylyfqhy
+wunr
+svgh
+widimg
+o
+mqk
+ryxyphyo
+vdxaxtggwfoaobidrrpieqcdqctxbkeyncymxg
+unlweogi
+xaqctsgku
+lx
+pxduwrufoqtanxo
+iutllyfghrcld
+avxfsx
+nfngynu
+es
+bpxo
+fv
+xxldxl
+ytryu
+ejogyligfuhutw
+bsjyqwdqier
+ysahx
+vgmkq
+pldm
+axjsjk
+gpequwv
+pxdplbxxnot
+dwpm
+px
+yjffy
+wviutbsyqgd
+eqixunwm
+vdyneis
+kfjin
+doyci
+halykmv
+jkagnbvu
+rfywojm
+mctrmbyo
+ayyvxlh
+rwe
+rqhyrgpbtkqx
+ikhjyw
+axkbjrbbrhtlx
+lpkbtgokgwushetestceumxy
+pg
+chppyassihdqfxjmfdsxy
+cujbvcscnwjfmlhiepr
+gygrn
+ugmueqrprptnrkkepap
+ivp
+eycnqpboypjdhdub
+rqm
+cst
+ktohkqnjsd
+lhqkwcpgfmkaebpifi
Index: tests/zombies/string-perf/corpus-100-2-1.txt
===================================================================
--- tests/zombies/string-perf/corpus-100-2-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-100-2-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,100 @@
+q
+yc
+by
+e
+wt
+od
+ev
+v
+c
+gjhk
+xla
+t
+u
+e
+q
+v
+e
+c
+h
+e
+dt
+icsppbpddi
+ge
+lbrv
+hbil
+ssq
+y
+g
+p
+yf
+p
+j
+i
+ejb
+baciblv
+g
+d
+qpo
+f
+b
+vqvfr
+v
+n
+cq
+e
+cr
+qx
+ve
+luht
+j
+hcc
+vil
+xmw
+m
+r
+x
+f
+g
+c
+pwv
+k
+p
+mu
+k
+x
+eke
+winogdv
+l
+ja
+i
+btgs
+u
+b
+t
+l
+l
+s
+biajn
+paxy
+piy
+e
+kud
+vl
+w
+t
+q
+tt
+vd
+us
+u
+mldo
+h
+oc
+paol
+oihhxe
+x
+gkwby
+v
+g
+b
Index: tests/zombies/string-perf/corpus-100-20-1.txt
===================================================================
--- tests/zombies/string-perf/corpus-100-20-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-100-20-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,100 @@
+wlgfygaqsdfmqvcygkiyaasjonymuarrnaamiadd
+krvjuwrhgqjgmvwaujuudplgpxo
+euwomuajssryjd
+v
+ey
+nvtslfydfquj
+tbxpbiitchgfoehs
+fiaydngdrmv
+xhjyhbbrjwtsdcjilensmnupebuvpqkoavniwqaiowbt
+mcmqqffgcxkeuivmvkoryypr
+xgycbaofoixvphyntfjdbxyomspmihojqpnrreyimxgdhhsbmcgqcffpyuejc
+ssmgmel
+oamuftdywrdekgjpxkmewrbpmnyatmoiodduyitvdyanhmefwsltkmmxcnavaoeotklsuhqxhrmoeswdlixwxmuaa
+wcndshpfclmsltkalqsiuhqueohbrjxollreukjwvyr
+sfkevdoskgnqwwtoitfthabekmbilvrhbc
+yib
+ujgoigiaofhlmhorrbuap
+uwtw
+thnmdyurkdckuhtg
+cuovxj
+pdtmyqasynhenfvxkxkfigldiitfjdgyia
+isodtclxrsvrdwejflwktiebrjhqsjfddvgyytxs
+v
+sspcxd
+ixjobbylutwcwayfaacauqvgjrynpcpbcy
+gdqtxmqcjtbrvdtvykthwlikenchpeyxhs
+hfljrfnldsfbrruaqjiepxgyokaotujbbwnuebghtniohfqyqbfialh
+ykfufqyinmdtplblylcj
+skkwpvwdfpepuavobeepkyhvc
+v
+xhksrup
+sokyerocrmq
+twkevraymxpkfagwwvgqltrplirfvkari
+vg
+vhqwwecykcygirtejmprgup
+whcjdi
+cqhbpl
+rxhqgsidwrpplvmcpklrvrdktvtwnhcffkvnfgqexgtmfhou
+cpptscnoxmcfpkm
+gbhnrlnyiagpqbltqdnlgeceqfmgryixarnugevogcgxdrtwujidnlkhswpkvbkysbtyfpnlr
+lwnfvlphofsyonvfaugmtbppdufsjypwxdduoucgcwfrmew
+yfbuirklorfaquxqadnrxpxc
+ftdjsriav
+jpnuefahxwf
+xifrixpkouhshakpdivmx
+j
+rmmrjtljcrbmrsygqgyxjmpmulbtx
+yrwnjhhxslpwxjpwpiepgpeycykduintaljmuqkpccmalfadng
+w
+yvayiftrsqtgaidt
+tvyiymnyqeh
+ddlbdkjigddwamairtgnpfwqsk
+l
+wwtciuhufpckvbkkbvcucqnjneeawp
+vpnb
+jivqbadwdohfmlcocrarwhuvwmroc
+p
+e
+efpicsylalwdccuevtlqrlfm
+ihpvlfdqunuomi
+aite
+rkgnwagi
+sknadmmipfedburjlrrixe
+inphnvrso
+jriv
+qllwomtgygasoaxqilgsbdkttpfnxbtrogqdullttnnknnbybj
+cmexjuew
+frowagcutorneh
+sudtvmlxcrxlmckkkeyhehjc
+atqfbqxxttvhft
+wrwmwjyhoxougayjbsbgvtgtqapahllggkufttmku
+ibdhmgdnoy
+wvbwndgcopkykpuheich
+fmarvfikhuifvhsyqwpghqsylcdvgmoncri
+wqkgns
+jdhkteccoswpgavfgitumnd
+nvxtjsguvphrtjtketbmtwrchoyucehpchmnbuiykrrgdnrjhuw
+toibdhxgoixq
+mfs
+psrkmbnasxkpwn
+lxmpglxwvxnnl
+hsncnxoon
+jnbbkrkwpwoxkmuiklwxigtvihvyxkpjarkllwkbvychnyramq
+vwsthcqi
+dyldsxoeuyhqajanjsqvjrtjkosofcqibclvadauejnftoufj
+dufaepoagvcwgfbtbbwdxemolidgpmuvjavoskqyisyoaakde
+geousaexitmdpwgnnbxeciwbwyeicisimjfijjgrgtxxqgoehmilxhpugtfkeausjabumipucnuutjbdyjqwsgtbcalgcgaoiblulbppolkkulntwfqpnlsqnewrm
+ivbuqmvjdnupxreoobvftlsmcitcdgbleeixr
+h
+ueouxsl
+uhuqtndxyyacgenmiwkce
+ybaqvyjiler
+unwbmxaoaispvcmigsfgtfysgidsnubklalxxooawiqumfgsylbusapa
+ssyqvlcy
+cyoqcnbslpxrjydmwvnmvyiqxypldqlfpaxrq
+mcrntdoyqlwgbvflo
+kgqpwfwpf
+jxywatkvwbwnpuvqsbchioocgnhddoannakptwmsxjjngfgyhkjrbathnbkrsnhgprvjqkequnf
+tnfdyoucqrkeuwxnkftayslpdqhxgoeacjdd
+biossun
Index: tests/zombies/string-perf/corpus-100-5-1.txt
===================================================================
--- tests/zombies/string-perf/corpus-100-5-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-100-5-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,100 @@
+hsiq
+erkpoqlew
+tpgsfigwyn
+tbpuf
+nns
+ukakbqxhnob
+wvlhckh
+wdvoyc
+orjemthy
+xweonftkbh
+gs
+yrfujgy
+xr
+e
+fl
+c
+d
+drnwcqhwwc
+xv
+tfp
+hnmsutaiaew
+maw
+aa
+h
+qlbphi
+nx
+wo
+qlpqtpv
+uitslvsf
+tvqunydboe
+lugegvvcntvic
+bpo
+uuqtnl
+mrldxvrs
+v
+atfn
+cxswa
+nxg
+oaydjnu
+rusjnwh
+ycvo
+an
+wptlnaxdcwilldl
+aeqpe
+gfaeu
+fidc
+y
+ny
+qb
+ypbebgg
+w
+nxctx
+o
+oywsyvj
+xa
+bnh
+povxugvtt
+v
+tfgnvfm
+gkbtib
+mqlf
+achxi
+reb
+uwxbmtjyj
+mklwn
+jf
+p
+ctwacerif
+d
+gfrcqtmggysd
+i
+u
+fknbkpfo
+nw
+rcb
+vd
+pr
+vtqahcpemwqax
+qfsbsrvmvwlrcdiw
+gq
+iawxg
+w
+mwbf
+vivpeil
+wficp
+gwvc
+xbgelfbbdeif
+rd
+vofcnlkpdpwcnb
+ncs
+qxur
+acjctousdau
+nfjr
+gvmj
+al
+reamxdobo
+ue
+njoibdpkw
+ssbccbpduufkslyvasr
+hfq
Index: tests/zombies/string-perf/corpus-5-20-1.txt
===================================================================
--- tests/zombies/string-perf/corpus-5-20-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-5-20-1.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,5 @@
+xtprjlkvxoha
+fwjvjxlhetotwuvrrkplahwm
+tmjdpckmmgwmtgqpwnpsjhktwyvhvkbpakuppfccoboijhbhu
+agxkcwlyeilialuvbkbgopjfbtpcbmsbtsnxpaywklhk
+cibpmhges
Index: tests/zombies/string-perf/corpus-5-20-2.txt
===================================================================
--- tests/zombies/string-perf/corpus-5-20-2.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-5-20-2.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,5 @@
+cyvgqodbfmnkefjurrjmfloimkldtmcxlafcqkfwxuhe
+sbulkjsvydklonfb
+dotktl
+ykvwtaymbvalgsjfwwqnkxrfdgb
+amma
Index: tests/zombies/string-perf/corpus-5-20-3.txt
===================================================================
--- tests/zombies/string-perf/corpus-5-20-3.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/corpus-5-20-3.txt	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,5 @@
+otado
+drymnkbfofeqkjbythdtprmnjbikhwfmre
+fpdmgiqw
+a
+twhxqwrenbhvnqusgma
Index: tests/zombies/string-perf/make-corpus.cfa
===================================================================
--- tests/zombies/string-perf/make-corpus.cfa	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/make-corpus.cfa	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,47 @@
+#include <stdlib.hfa>
+#include <math.h>
+#include <limits.h>
+#include <unistd.h>
+
+// generate random draws from a geometric distribution of the given mean
+// https://math.stackexchange.com/questions/485448/prove-the-way-to-generate-geometrically-distributed-random-numbers
+static double denom;
+static void initialize(int mean) {
+    srand(getpid());
+    double p = 1.0 / (double) mean;
+    denom = log(1-p);
+}
+static int nextGeoRand() {
+    // ret = ⌊ln(U)/ln(1−p)⌋ where U ~ U(0, 1)
+    double U = (double)rand() / (double)INT_MAX;
+    return 1 + (int) (log(U) / denom);
+}
+
+// write a randomly generated alphabetic string whose length is drawn from above distribution
+static void emit1() {
+    int lim = nextGeoRand();
+    // printf("==%d\n", lim);
+    for (i; lim) {
+        char emit = 'a' + (rand() % ('z'-'a'));
+        printf("%c", emit);
+    }
+    printf("\n");
+}
+
+// usage: ./make-corpus toGen mean
+int main(int argc, char ** argv) {
+    assert(argc == 3);
+
+    int toGen = atoi(argv[1]);
+    assert(toGen > 0);
+    assert(toGen < 1000000);
+
+    int mean = atoi(argv[2]);
+    assert(mean > 0);
+    assert(mean < 1000);
+
+    initialize(mean);
+    for( i; toGen ) {
+        emit1();
+    }
+}
Index: tests/zombies/string-perf/prog.cfa
===================================================================
--- tests/zombies/string-perf/prog.cfa	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
+++ tests/zombies/string-perf/prog.cfa	(revision 01db3013a1860498b8e5281ebd2e0dab01171bf5)
@@ -0,0 +1,104 @@
+
+#if defined IMPL_STL
+  #include <string>
+  #include <iostream>
+  #include <cstdio>
+  using namespace std;
+
+#elif defined IMPL_CFA_HL_SHARE
+  #define IMPL_CFA_HL
+
+#elif defined IMPL_CFA_LL_SHARE
+  #define IMPL_CFA_LL
+
+#elif defined IMPL_CFA_HL_NOSHARE
+  #define IMPL_CFA_HL
+  #define CFA_NOSHARE
+
+#elif defined IMPL_CFA_LL_NOSHARE
+  #define IMPL_CFA_LL
+  #define CFA_NOSHARE
+
+#elif defined IMPL_BUHR94
+  #include <iostream>
+  #include <cstdio>
+  #include "/u0/mlbrooks/usys1/sm/string/StringSharing/src/string.h"
+
+#else
+  #error Bad IMPL_
+#endif
+
+
+#if defined IMPL_CFA_HL
+  #include <string.hfa>
+#elif defined IMPL_CFA_LL
+  #include <string_res.hfa>
+#endif
+
+#if defined CFA_NOSHARE
+  #include <string_sharectx.hfa>
+  #define STRING_SHARING_CONTROL \
+    string_sharectx c = { NO_SHARING };
+#else 
+  #define STRING_SHARING_CONTROL
+#endif
+
+
+#include <time.h>
+
+
+#if defined IMPL_STL || defined IMPL_BUHR94
+    #define PRINT(s) std::cout << s << std::endl
+#elif defined IMPL_CFA_HL || defined IMPL_CFA_LL
+    #define PRINT(s) sout | s;
+#else
+    #error Unhandled print case
+#endif
+
+volatile int checkthis = 0;
+#define MAYBE( op ) if (checkthis) { op; }
+
+int main( int argc, char ** argv ) {
+
+        STRING_SHARING_CONTROL
+
+        enum { NumConcats = 100, Times = 5000000 };
+        clock_t start, end;
+
+    int corpuslen = argc - 1;
+    char ** corpus = argv + 1;
+
+    #if defined IMPL_CFA_LL
+        string_res x = "foo2";
+        string_res y;
+        string_res z;
+        #define RESET y = x;
+    #else
+        string x = "foo2";
+        string y;
+        #define RESET y = x;
+    #endif
+
+    start = clock();
+    for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+            RESET
+            for ( volatile unsigned int i = 0; i < NumConcats; i += 1 ) {
+              MAYBE( PRINT(y) )
+              char *toAppend = corpus[i%corpuslen];
+              #if defined OP_PLUS_THEN_ASSIGN && defined IMPL_CFA_LL
+                 z = y;
+                 z += toAppend;
+                 y = z;
+              #elif defined OP_PLUS_THEN_ASSIGN
+                 y = y + toAppend;
+              #elif defined OP_PLUSEQ
+                 y += toAppend;
+              #endif
+            }
+    }
+    end = clock();
+    double elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
+    printf("%f sec\n", elapsed);
+
+    return 0;
+}
