digitalmars.D.learn - monitoring variable evaluation time
- Clayton (8/8) Jul 20 2015 What could be the best-tool for monitoring the evaluation time of
- anonymous (32/40) Jul 20 2015 You mean you want to know if some value is pre-computed during
- Clayton (3/8) Jul 20 2015 Thankyou a lot for the suggestion. Am noting as I learn the
- "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> (22/30) Jul 20 2015 I'm not sure that's what you want to know, but...
- Clayton (3/12) Jul 20 2015 Thankyou a lot for the suggestion. Am noting as I learn the
What could be the best-tool for monitoring the evaluation time of a variable . What I usually do is run the command :- - dmd -J. program.d Then I inspect the program.o file using vi for presence of compile-time constants and enums. I am wondering if this is the right way to do this. Am a bit skeptical about this as am working on pushing everything that the compiler can do to the compiler for faster run-time.
Jul 20 2015
On Monday, 20 July 2015 at 08:53:52 UTC, Clayton wrote:What could be the best-tool for monitoring the evaluation time of a variable . What I usually do is run the command :- - dmd -J. program.d Then I inspect the program.o file using vi for presence of compile-time constants and enums. I am wondering if this is the right way to do this. Am a bit skeptical about this as am working on pushing everything that the compiler can do to the compiler for faster run-time.You mean you want to know if some value is pre-computed during compilation? There are various places where the compiler is required to compute at compile time: * initializers of module level variables * initializers of static variables * enum values * dimensions of static arrays * template value arguments * probably a couple more I can't of right now In these places where pre-computation is guaranteed, it's called CTFE. Compilers are free to pre-compute other constants (constant folding). It's pretty safe to assume that simple, constant arithmetic expressions are evaluated at compile-time, maybe it's even guaranteed. Beyond that, things vary between compilers. Instead of checking if the compiler recognizes your constants and pre-computes them, I'd suggest to force it by using a CTFE context. To force CTFE in an otherwise non-CTFE context, you can use a little helper: ---- enum ctEval(alias expr) = expr; void main() { auto x = ctEval!(/* some complex expression that would possibly not be constant folded otherwise */); } ---- I'm not sure if this the best way to define ctEval. I thought it had found its way into phobos by now, but I can't find it anywhere. This very simple version here may have issues.
Jul 20 2015
On Monday, 20 July 2015 at 09:29:26 UTC, anonymous wrote:On Monday, 20 July 2015 at 08:53:52 UTC, Clayton wrote:Thankyou a lot for the suggestion. Am noting as I learn the language.[...]You mean you want to know if some value is pre-computed during compilation? [...]
Jul 20 2015
On Monday, 20 July 2015 at 08:53:52 UTC, Clayton wrote:What could be the best-tool for monitoring the evaluation time of a variable . What I usually do is run the command :- - dmd -J. program.d Then I inspect the program.o file using vi for presence of compile-time constants and enums. I am wondering if this is the right way to do this. Am a bit skeptical about this as am working on pushing everything that the compiler can do to the compiler for faster run-time.I'm not sure that's what you want to know, but... The evaluation time of expressions is completely deterministic. Global (module level) or static variables, default values for struct/class members, template arguments, as well as enums, are evaluated at compile-time and thus their construction has no runtime costs. Everything else can, and usually does, happen at runtime (modulo anything I might have overlooked in the list above). But even then, compilers are free to evaluate things during optimization, as long as it's possible and makes no observable difference in behaviour. For example, with optimization enabled, both GDC and LDC can even evaluate some complex recursive function calls to their result. But these optimizations are optional. If you want a guarantee, you need to use one of the above contexts. You can use a simple helper template for that (untested): template forceCTFE(Args...) if(Args.length == 1) { alias forceCTFE = Args[0]; } void main() { auto myvar = forceCTFE!(foo(23)); }
Jul 20 2015
On Monday, 20 July 2015 at 10:11:10 UTC, Marc Schütz wrote:On Monday, 20 July 2015 at 08:53:52 UTC, Clayton wrote:Thankyou a lot for the suggestion. Am noting as I learn the language.[...]I'm not sure that's what you want to know, but... The evaluation time of expressions is completely deterministic. Global (module level) or static variables, default values for struct/class members, template arguments, as well as enums, are evaluated at compile-time and thus their construction has no runtime costs. [...]
Jul 20 2015