I didn't even bother looking up what zones are for until now.

Judging by information on CocoaDev, it looks to me like zones might
primarily be interesting to games, screensavers and other
continuously-rendered and high-performance applications.

It would be interesting to have this as a ./configure-able setting when
building the runtime, with the default being current behavior. Reducing RAM
usage is not very important these days.

On Thu, Jul 21, 2011 at 14:01, David Chisnall <[email protected]> wrote:

> Hello the list.
>
> I said a little while ago that I was uncertain about the utility of the
> zone pointer for every object, because in most cases it would be wasting one
> word per object to store a value that is the same for every single object.
>
> I decided to test this, with the attached diff.  Please test it and see
> what you find.  On exit, it will log the number of times zone lookup was
> performed and the number of times that it returned a zone other than the
> default malloc() zone.
>
> In my testing, Gorm's memory usage dropped by about 2MB and it used a
> non-default zone precisely zero times.  If this is representative, then it
> would make sense to commit the NSObject portion of this diff, so we can
> avoid burning RAM for no benefit.  If, on the other hand, people are
> actually using zones a lot, then this will make their code slower and so is
> a bad idea.
>
> David
> --
> This email complies with ISO 3103
>
> Index: Source/NSObject.m
> ===================================================================
> --- Source/NSObject.m   (revision 33594)
> +++ Source/NSObject.m   (working copy)
> @@ -409,7 +409,6 @@
>  *     (before the start) in each object.
>  */
>  typedef struct obj_layout_unpadded {
> -    NSZone     *zone;
>     NSUInteger retained;
>  } unp;
>  #define        UNP sizeof(unp)
> @@ -420,7 +419,6 @@
>  *     structure correct.
>  */
>  struct obj_layout {
> -    NSZone     *zone;
>     NSUInteger retained;
>     char       padding[ALIGN - ((UNP % ALIGN) ? (UNP % ALIGN) : ALIGN)];
>  };
> @@ -770,7 +768,7 @@
>   GSOnceFLog(@"GSObjCZone() is deprecated ... use -zone instead");
>   if (object_getClass(object) == NSConstantStringClass)
>     return NSDefaultMallocZone();
> -  return ((obj)object)[-1].zone;
> +  return NSZoneFromPointer(object);
>  }
>  #endif
>
> @@ -818,7 +816,6 @@
>   if (new != nil)
>     {
>       memset (new, 0, size);
> -      ((obj)new)->zone = zone;
>       new = (id)&((obj)new)[1];
>       object_setClass(new, aClass);
>       AADD(aClass, new);
> @@ -861,7 +858,7 @@
>   if ((anObject != nil) && !class_isMetaClass(aClass))
>     {
>       obj      o = &((obj)anObject)[-1];
> -      NSZone   *z = o->zone;
> +      NSZone   *z = NSZoneFromPointer(o);
>
>       /* Call the default finalizer to handle C++ destructors.
>        */
> @@ -2160,7 +2157,7 @@
>    */
>   return NSDefaultMallocZone();
>  #else
> -  return (((obj)self)[-1]).zone;
> +  return NSZoneFromPointer(self);
>  #endif
>  }
>
> Index: Source/NSZone.m
> ===================================================================
> --- Source/NSZone.m     (revision 33594)
> +++ Source/NSZone.m     (working copy)
> @@ -1932,14 +1932,26 @@
>  }
>
>  static void rnfree (NSZone *zone, void *ptr);
> +static long long defaultZoneLookups;
> +static long long otherZoneLookups;
>
> +__attribute__((destructor))
> +static void logStats(void)
> +{
> +    fprintf(stderr, "NSZoneFromPointer() called %lld times.  %lld
> non-default zones returned\n", defaultZoneLookups + otherZoneLookups,
> otherZoneLookups);
> +}
> +
>  GS_DECLARE NSZone*
>  NSZoneFromPointer(void *ptr)
>  {
>   NSZone       *zone;
>
>   if (ptr == 0) return 0;
> -  if (zone_list == 0) return &default_zone;
> +  if (zone_list == 0)
> +    {
> +      defaultZoneLookups++;
> +      return &default_zone;
> +    }
>
>   /*
>    *   See if we can find the zone in our list of all zones.
> @@ -1953,6 +1965,16 @@
>        }
>     }
>   [gnustep_global_lock unlock];
> +  if (0 != zone)
> +    {
> +      otherZoneLookups++;
> +      NSLog(@"Non-default zone found");
> +    }
> +  else
> +    {
> +      defaultZoneLookups++;
> +    }
> +
>   return (zone == 0) ? &default_zone : zone;
>  }
>
>
>
> _______________________________________________
> Discuss-gnustep mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/discuss-gnustep
>



-- 
Ivan Vučica - [email protected]
Zombie Ball for the iPhone - Squish them all... with a ball!
http://j.mp/zombieball - http://j.mp/zb-game
_______________________________________________
Discuss-gnustep mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnustep

Reply via email to