Running Phobos unit tests in threads: I have data
Atila Neves via Digitalmars-d
digitalmars-d at puremagic.com
Sat May 3 05:08:55 PDT 2014
I turned off all output to check. It was still slower with
multiple threads. That was the only "weird" thing I was doing I
could think of as the cause. Otherwise it's just a foreach(test;
tests.parallel) { test(); }.
Atila
On Saturday, 3 May 2014 at 11:54:55 UTC, Atila Neves wrote:
> So I tried using unit-threaded to run Phobos unit tests again
> and had problems (which I'll look into later) with its
> compile-time reflection. Then I realised I was an idiot since I
> don't need to reflect on anything: all Phobos tests are in
> unittest blocks so all I need to do is include them in the
> build and unit-threaded will run them for me.
>
> I tried a basic sanity check by running them in one thread only
> with the -s option and got a segfault, and a failing test
> before that. None of this should happen, and I'll be taking a
> look at that as well.
>
> But I carried on by removing the troublesome modules from the
> build. These turned out to be:
>
> std.datetime (fails)
> std.process (fails and causes the segfault)
> std.stdio (fails)
>
> All the others pass in single threaded mode. After this I tried
> using threads and std.parallelism failed, so I took that away
> from the build as well.
>
> Another thing to mention is that although the tests are running
> in threads, since when I wrote the library the getUnitTests
> __traits wasn't available (and since then I wasn't interested
> in using it), each module's unit tests run as one test. So they
> only interleave with other modules, not with each other.
>
> Running in one thread took 39 +/- 1 seconds.
> Running in 8 threads took... ~41 seconds.
>
> Oops. I noticed some tests take a lot longer so I tried
> removing those. They were:
>
> std.file
> std.conv
> std.regex
> std.random
> std.container
> std.xml
> std.utf
> std.numeric
> std.uuid
> std.exception
>
> I also removed any modules that were likely to be problematic
> like std.concurrency and std.socket. With the reduced sample
> size the results were:
>
> 1 thread: ~1.9s
> 8 threads: 4.1s +/- 0.2
>
> So the whole threading thing isn't looking so great. Or at
> least not how I implemented it. This got me thinking about my
> own projects. The tests run so fast I never really paid
> attention to how fast they were running. I compared running the
> unit tests in Cerealed in one or more threads and got the same
> result: running in one thread was faster.
>
> I have to look to be sure but maybe the bottleneck is output.
> As in actually printing the results to the screen. I had to
> jump through a few hoops to make sure the output wasn't
> interleaved, and in the end decided to have one thread be
> responsible for that, with the tests sending it output messages.
>
> For reference, I copied all of the std/*.d modules into a local
> std directory, compiled all of them with dmd -unittest -c, then
> used this as the build command:
>
> dmd -unittest -I~/coding/d/unit-threaded/source ut.d
> std/algorithm.o std/array.o std/ascii.o std/base64.o
> std/bigint.o std/bitmanip.o std/compiler.o std/complex.o
> std/container.o std/cstream.o std/csv.o std/demangle.o
> std/encoding.o std/format.o std/functional.o std/getopt.o
> std/json.o std/math.o std/mathspecial.o std/metastrings.o
> std/mmfile.o std/numeric.o std/outbuffer.o std/range.o
> std/signals.o std/stdint.o std/stdiobase.o std/stream.o
> std/string.o std/syserror.o std/system.o std/traits.o
> std/typecons.o std/typelist.o std/typetuple.o std/uri.o
> std/variant.o std/zip.o std/zlib.o libunit-threaded.a
> -ofphobos_ut
>
> I got libunit-threaded.a by running "dub build" in the root
> directory of unit-threaded.
>
> I might just implement a random order option now. Hmm.
>
> Atila
More information about the Digitalmars-d
mailing list