Reduce temporary string allocations

Instead of modifying the name of an OpenGL symbol on the managed side,
before copying it to the unmanaged side, we perform the modification
directly on the unmanaged side. This reduces the total amount of
allocations in OpenTK by ~30% (673496 bytes in 10750 objects compared
to 930272 bytes in 15243 objects before this modification.)
This commit is contained in:
Stefanos A 2013-12-05 11:20:58 +01:00
parent b2911267c2
commit ca5a5b4d16

View file

@ -479,15 +479,35 @@ namespace OpenTK.Platform.MacOS
public override IntPtr GetAddress(string function) public override IntPtr GetAddress(string function)
{ {
string fname = "_" + function; // Instead of allocating and combining strings in managed memory
if (!NSIsSymbolNameDefined(fname)) // we do that directly in unmanaged memory. This way, we avoid
return IntPtr.Zero; // 2 string allocations every time this function is called.
IntPtr symbol = NSLookupAndBindSymbol(fname); // must add a '_' prefix and null-terminate the function name,
if (symbol != IntPtr.Zero) // hence we allocate +2 bytes
symbol = NSAddressOfSymbol(symbol); IntPtr ptr = Marshal.AllocHGlobal(function.Length + 2);
try
return symbol; {
Marshal.WriteByte(ptr, (byte)'_');
for (int i = 0; i < function.Length; i++)
{
Marshal.WriteByte(ptr, i + 1, (byte)function[i]);
}
Marshal.WriteByte(ptr, function.Length + 1, 0); // null-terminate
IntPtr symbol = IntPtr.Zero;
if (NSIsSymbolNameDefined(ptr))
{
symbol = NSLookupAndBindSymbol(ptr);
if (symbol != IntPtr.Zero)
symbol = NSAddressOfSymbol(symbol);
}
return symbol;
}
finally
{
Marshal.FreeHGlobal(ptr);
}
} }
public override IntPtr GetAddress(IntPtr function) public override IntPtr GetAddress(IntPtr function)