Running Phobos unit tests in threads: I have data
Rikki Cattermole via Digitalmars-d
digitalmars-d at puremagic.com
Sat May 3 05:21:11 PDT 2014
On Saturday, 3 May 2014 at 12:08:56 UTC, Atila Neves wrote:
> 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
Out of curiosity are you on Windows?
More information about the Digitalmars-d
mailing list