[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:
Родитель
0e9847f891
Коммит
6d04431838
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче