[ObjCRuntime] Improve MarkDirty speed by caching the IsCustomType value in our flags byte. (#4128)

* [ObjCRuntime] Improve MarkDirty speed by caching the IsCustomType value in our flags byte.

This makes calling MarkDirty for custom types ~60x times faster.

Reference: https://xamarinhq.slack.com/archives/C03CCJHCF/p1527194568000197

* We only have one bit left to use for IsCustomType.

* Fix build and make enums between native and managed match.
This commit is contained in:
Rolf Bjarne Kvinge 2018-05-25 05:36:28 -04:00 коммит произвёл GitHub
Родитель 0e9847f891
Коммит 6d04431838
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 17 добавлений и 1 удалений

Просмотреть файл

@ -139,6 +139,8 @@ enum NSObjectFlags {
NSObjectFlagsRegisteredToggleRef = 8,
NSObjectFlagsInFinalizerQueue = 16,
NSObjectFlagsHasManagedRef = 32,
// 64, // Used by SoM
NSObjectFlagsIsCustomType = 128,
};
struct AssemblyLocation {

Просмотреть файл

@ -79,6 +79,8 @@ namespace Foundation {
RegisteredToggleRef = 8,
InFinalizerQueue = 16,
HasManagedRef = 32,
// 64, // Used by SoM
IsCustomType = 128,
}
bool disposed {
@ -103,6 +105,18 @@ namespace Foundation {
get { return ((flags & Flags.InFinalizerQueue) == Flags.InFinalizerQueue); }
}
bool IsCustomType {
get {
var value = (flags & Flags.IsCustomType) == Flags.IsCustomType;
if (!value) {
value = Class.IsCustomType (GetType ());
if (value)
flags |= Flags.IsCustomType;
}
return value;
}
}
[Export ("init")]
public NSObject () {
bool alloced = AllocIfNeeded ();
@ -169,7 +183,7 @@ namespace Foundation {
if (IsRegisteredToggleRef)
return;
if (!allowCustomTypes && Class.IsCustomType (GetType ()))
if (!allowCustomTypes && IsCustomType)
return;
IsRegisteredToggleRef = true;