[Vm-dev] Direct object pointers vs indirect ones pros and cons

Bert Freudenberg bert at freudenbergs.de
Fri Nov 12 15:44:42 UTC 2010


On 12.11.2010, at 14:41, Igor Stasenko wrote:

> I'm inviting you to make own version of benchmark

I don't think this can be realistically simulated inside Squeak. But possibly you could change the macros in sqMemoryAccess.h to fake an object table access? 

I just tried that. Using tinyBenchmarks, byte code performance drops to 63% and sends to 78%.

Now declaring that variable volatile might be overkill as it prevents all caching, but I couldn't quite figure out a more realistic declaration.

- Bert -

#else
# ifndef FAKE_OBJ_TABLE
# define FAKE_OBJ_TABLE
  static volatile int FakeObjTable= 0;
# define OBJTABLELOOKUP(oop) (oop + FakeObjTable)
# endif
  /* Use macros when static inline functions aren't efficient. */
# define byteAtPointer(ptr)		((sqInt)(*((unsigned char *)(OBJTABLELOOKUP(ptr)))))
# define byteAtPointerput(ptr, val)	((sqInt)(*((unsigned char *)(OBJTABLELOOKUP(ptr)))= (unsigned char)(val)))
# define shortAtPointer(ptr)		((sqInt)(*((short *)(OBJTABLELOOKUP(ptr)))))
# define shortAtPointerput(ptr, val)	((sqInt)(*((short *)(OBJTABLELOOKUP(ptr)))= (short)(val)))
# define intAtPointer(ptr)		((sqInt)(*((unsigned int *)(OBJTABLELOOKUP(ptr)))))
# define intAtPointerput(ptr, val)	((sqInt)(*((unsigned int *)(OBJTABLELOOKUP(ptr)))= (int)(val)))
# define longAtPointer(ptr)		((sqInt)(*((sqInt *)(OBJTABLELOOKUP(ptr)))))
# define longAtPointerput(ptr, val)	((sqInt)(*((sqInt *)(OBJTABLELOOKUP(ptr)))= (sqInt)(val)))
# define oopAtPointer(ptr)		(sqInt)(*((sqInt *)OBJTABLELOOKUP(ptr)))
# define oopAtPointerput(ptr, val)	(sqInt)(*((sqInt *)OBJTABLELOOKUP(ptr))= (sqInt)val)
# define pointerForOop(oop)		((char *)(sqMemoryBase + ((usqInt)(oop))))
# define oopForPointer(ptr)		((sqInt)(((char *)(ptr)) - (sqMemoryBase)))
# define byteAt(oop)			byteAtPointer(pointerForOop(oop))
# define byteAtput(oop, val)		byteAtPointerput(pointerForOop(oop), (val))
# define shortAt(oop)			shortAtPointer(pointerForOop(oop))
# define shortAtput(oop, val)		shortAtPointerput(pointerForOop(oop), (val))
# define longAt(oop)			longAtPointer(pointerForOop(oop))
# define longAtput(oop, val)		longAtPointerput(pointerForOop(oop), (val))
# define intAt(oop)			intAtPointer(pointerForOop(oop))
# define intAtput(oop, val)		intAtPointerput(pointerForOop(oop), (val))
# define oopAt(oop)			oopAtPointer(pointerForOop(oop))
# define oopAtput(oop, val)		oopAtPointerput(pointerForOop(oop), (val))
#endif



More information about the Vm-dev mailing list