I'm a little OCD - who cares about memory to that degree anymore when we have gigabytes of RAM? This might not even come into play on the Raspberry Pi.

Memory is very important when it comes to performance, the moving of memory is the single most energy demanding task the CPU (and the GPU for that matter) has.
See
(http://channel9.msdn.com/Events/Build/2013/4-329 and
 http://media.medfarm.uu.se/play/video/3261 for why this is so)

Anyhow if you want to get a good understanding about how memory works and is related to performance i would highly recommend reading this entire PDF http://www.akkadia.org/drepper/cpumemory.pdf

Then I took Architecture & Assembly class. There I learned that the load instruction grabs an entire native word size, every time, regardless of how many bits your variable takes up.

When we programmed in assembly in that class, for both performance and coding ease, we only worked with variables that were the native code size.

Keep in mind that schools are usually 5-15 years behind current technology (especially introductory classes) and what was true then of performance does not have to be true today.

I found out that it's actually extra work for the processor to use values smaller than the native word size: it has to AND off the unwanted bits and possibly shift them over.

So, if dmd packs variables together, I would want to always use the native word size to avoid that extra work, and I would never want to use shorts, ints, or longs. Instead, I'd want to do this:

This "extra work" is highly unlikely to be your bottleneck. Also don't assume that making everything be of native size is going to make things faster just because of an AND/SHIFT instruction.

And then only use natives, unatives, and booleans (can't avoid them) for my primatives.

You can use normal integers in if statements if you want. Anything not 0 will be true.

int flag = someFunc();
if(flag)
{
   //Do something.
}

I really hope this isn't the case because it would make D's entire primative system pointless. In acedamia, C is often scolded for its ints always being the native word size, while Java is praised for being consistent from platform to platform. But if dmd packs its variables, D is the one that should be scolded and C is the one that should be praised for the same reason of the opposite.

D is like java.
(u)byte  is 8bit
(u)short is 16bit
(u)int   is 32bit
(u)long  is 64bit

size_t and pttdiff_t are of platform size.

Note that floats are always calculated by the systems highest precision.
float  32bit
double 64bit
real   platform dependant but never lower then 64bit.


//So, I need to have this question answered to even get past the
//function prototype stage - each answer would result in different
//code.

You should not care about this in the function prototype stage this is the essence of premature optimization. You cant be sure of how fast something is going to be before you profile it. And even then it will vary from run to run / computer to computer and compiler to compiler. I think this book gives a nice introduction to the subject. http://carlos.bueno.org/optimization/mature-optimization.pdf

Reply via email to