wilzbach / tools-test

1 stars 0 forks source link

rdmd runs dmd twice for single-files with no dependencies #144

Closed wilzbach closed 6 years ago

wilzbach commented 8 years ago

Note: the issue was created automatically migrated from https://issues.dlang.org

Original bug ID: BZ#16431 From: @wilzbach Reported version: D2 CC: ag0aep6g@gmail.com, andrej.mitrovich@gmail.com, johnnymarler@gmail.com

wilzbach commented 8 years ago

Comment author: @wilzbach

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 xrhs.x + yrhs.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);

}

wilzbach commented 8 years ago

Comment author: ag0aep6g@gmail.com

I don't think this is much of a surprise. rdmd detects dependencies. dub doesn't seem to do that.

wilzbach commented 8 years ago

Comment author: @wilzbach

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

wilzbach commented 8 years ago

Comment author: ag0aep6g@gmail.com

(In reply to greensunny12 from comment BZ#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.

wilzbach commented 7 years ago

Comment author: Andrej Mitrovic <andrej.mitrovich@gmail.com>

Fixed right? Closing.

wilzbach commented 7 years ago

Comment author: @wilzbach

PR was reverted :/

wilzbach commented 6 years ago

Comment author: Jonathan Marler <johnnymarler@gmail.com>

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"

wilzbach commented 6 years ago

Comment author: Jonathan Marler <johnnymarler@gmail.com>

https://github.com/dlang/tools/pull/271