Bug 16431 – rdmd runs dmd twice for single-files with no dependencies

Status
RESOLVED
Resolution
MOVED
Severity
normal
Priority
P1
Component
tools
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2016-08-25T20:50:41Z
Last change time
2021-01-09T11:04:20Z
Assigned to
No Owner
Creator
Seb

Comments

Comment #0 by greensunny12 — 2016-08-25T20:50:41Z
> python -m timeit -v -n 10 -s 'import os' 'os.system("dub run --single --force foo.d")' 10 loops, best of 3: 578 msec per loop > python -m timeit -v -n 10 -s 'import os' 'os.system("rdmd --force foo.d")' 10 loops, best of 3: 730 msec per loop I used an example from the DLang Tour (see below or http://tour.dlang.io/tour/en/gems/template-meta-programming) and tested with more and the overhead seems to stay there: == Associative arrays == http://tour.dlang.io/tour/en/basics/associative-arrays rdmd 5 loops, best of 3: 637 msec per loop dub: 5 loops, best of 3: 584 msec per loop == Loops == http://tour.dlang.io/tour/en/basics/loops rdmd: 5 loops, best of 3: 488 msec per loop dub: 5 loops, best of 3: 373 msec per loop #!/usr/bin/env rdmd /+ dub.sdl: name "foo" +/ import std.traits: isFloatingPoint; import std.uni: toUpper; import std.string: format; import std.stdio: writeln; /// A Vector that just works for /// numbers, integers or floating points. struct Vector3(T) if (is(T: real)) { private: T x,y,z; /// Generator for getter and setter because /// we really hate boiler plate! /// /// var -> T getVAR() and void setVAR(T) mixin template GetterSetter(string var) { // Use mixin to construct function // names mixin("T get%s() const { return %s; }" .format(var.toUpper, var)); mixin("void set%s(T v) { %s = v; }" .format(var.toUpper, var)); } // Easily generate our getX, setX etc. // functions with a mixin template. mixin GetterSetter!"x"; mixin GetterSetter!"y"; mixin GetterSetter!"z"; public: // We don't allow the dot function // for anything but floating points static if (isFloatingPoint!T) { T dot(Vector3!T rhs) { return x*rhs.x + y*rhs.y + z*rhs.z; } } } void main() { auto vec = Vector3!double(3,3,3); // That doesn't work because of the template // constraint! // Vector3!string illegal; auto vec2 = Vector3!double(4,4,4); writeln("vec dot vec2 = ", vec.dot(vec2)); auto vecInt = Vector3!int(1,2,3); // doesn't have the function dot because // we statically enabled it only for float's // vecInt.dot(Vector3!int(0,0,0)); // generated getter and setters! vecInt.setX(3); vecInt.setZ(1); writeln(vecInt.getX, ",", vecInt.getY, ",", vecInt.getZ); }
Comment #1 by ag0aep6g — 2016-08-25T21:26:33Z
I don't think this is much of a surprise. rdmd detects dependencies. dub doesn't seem to do that.
Comment #2 by greensunny12 — 2016-08-26T02:00:56Z
> I don't think this is much of a surprise. rdmd detects dependencies. dub doesn't seem to do that. Well, it still seems unnecessary to me to run the full-blown CTFE compiler twice on a file. I gave it a quick try with two hacks: https://github.com/dlang/tools/pull/191
Comment #3 by ag0aep6g — 2016-08-26T13:08:02Z
(In reply to greensunny12 from comment #2) > Well, it still seems unnecessary to me to run the full-blown CTFE compiler > twice on a file. Sure. If you make rdmd faster, that's great. I just don't think that dub has anything to do with it.
Comment #4 by andrej.mitrovich — 2016-08-31T21:30:26Z
Fixed right? Closing.
Comment #5 by greensunny12 — 2017-07-20T20:07:38Z
PR was reverted :/
Comment #6 by johnnymarler — 2017-12-14T16:37:33Z
Potential fix: https://github.com/dlang/tools/pull/271 "Use "-i" to prevent rdmd from having to invoke compiler twice." Depends on this first: https://github.com/dlang/dmd/pull/7099 "Enable automatic compiling of imports"
Comment #7 by johnnymarler — 2018-01-17T02:39:18Z
Comment #8 by johnnymarler — 2018-01-20T02:21:14Z
Comment #9 by pro.mathias.lang — 2020-06-05T12:30:50Z
Comment #10 by pro.mathias.lang — 2021-01-09T11:04:20Z
*** Issue 17583 has been marked as a duplicate of this issue. ***