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