On Friday, 30 October 2015 at 21:29:22 UTC, BBasile wrote:
__gshared is mostly usefull on fields (eg public uint a)

That's only true if it is at the module level or static. Ordinary struct members are whatever the container is and class members are on the heap unless you do something fancy.

module test;

int tls; // this is in tls
shared(int) s; // this is not TLS
__gshared int s; // also not TLS, same as shared(), but doesn't change the type

struct Foo {
   int var; // will be TLS only is the instance is TLS
   static int tls; // put in TLS
   shared(int) s; // not TLS
   __gshared int s; // also not TLS
}

class Foo {
   int var; // not TLS unless you do some weird allocation scheme
   static int tls; // TLS
   // you get the idea now
}

because it prevents a data to be put on the TLS, which in certain case reduces the perfs up to 30%. The byte code using a global variable that's not __gshared can be incredibly slower !

right, TLS has some cost but it has benefits too. Best performance is often gotten by not using globals much at all - try to get a local copy on the stack to work with. Then you will more likely be in the CPU cache and can see enormous speedups.

Reply via email to