Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Reduce code bloat around formatted GetResourceString calls #7007

Closed
wants to merge 2 commits into from

Conversation

jamesqo
Copy link

@jamesqo jamesqo commented Aug 31, 2016

Currently formatted calls to Environment.GetResourceString, i.e.

throw new ArgumentException(Environment.GetResourceString("Bad length: {0}", length));

call the GetResourceString(string, params object[]) overload. This requires allocating a new object array, which is done in the caller and unnecessarily bloats the code (since this is basically only called when we throw exceptions). I've made that overload private, and instead introduced a bunch of methods tagged NoInlining which just forward to the params overload. This reduces the System.Private.CoreLib size from 2376 -> 2372 (4 kB difference), and the size of the native image from 11060 -> 11037 (23 kB).

Related pull request: #6634

@benaadams @jkotas @AndyAyersMS PTAL

@jkotas
Copy link
Member

jkotas commented Aug 31, 2016

LGTM. Thanks

@jamesqo
Copy link
Author

jamesqo commented Aug 31, 2016

I just realized it is possible for the caller to have a pre-initialized array and pass it to GetResourceString and it will still compile even now that GetResourceString(string, object[]) is private:

object[] objects = { ... };
Environment.GetResourceString("fmt", objects); // before called GetResourceString(object[]), now calls GetResouceString(object) which is incorrect

To mitigate any risk of this happening, I'll change the object[] overload back to internal.

@jkotas
Copy link
Member

jkotas commented Aug 31, 2016

Actually, the noinlining attribute has extended meaning in corlib because of this check https://github.com/dotnet/coreclr/blob/master/src/vm/jitinterface.cpp#L6657. This change may be preventing inlinining in a lot more places than desired. It would be a good idea to check asm-diffs for bad deltas. @AndyAyersMS Are the instructions on how to run asm-diffs somewhere?

@AndyAyersMS
Copy link
Member

There are some notes on getting diffs here. Please direct any follow up on diffing to @russellhadley.

@benaadams
Copy link
Member

You'd end up with two no-lined methods in a row for all the ThrowHelper calls; but that's probably dwarfed by the exception being thrown (as a function that only throws does not inline - except in the cases that should be fixed by #6742)

Would lessen code size for the functions that don't use ThrowHelper as Environment.GetResourceString generally inlines

@benaadams
Copy link
Member

benaadams commented Sep 9, 2016

@jkotas @jamesqo just run the diffs on the current coreclr (so it has the ThrowHelper reductions already in it) and this change looks good from a diff point of view?

Found files with textual diffs.

Summary:
(Note: Lower is better)

Total bytes of diff: -21744 (-0.67 % of base)
    diff is an improvement.

Total byte diff includes 325 bytes from reconciling methods
        Base had    0 unique methods,        0 unique bytes
        Diff had    3 unique methods,      325 unique bytes

Top file improvements by size (bytes):
      -21744 : System.Private.CoreLib.dasm (-0.67 % of base)

1 total files with size differences.

Top method regessions by size (bytes):
         128 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref,ref,ref,ref):ref
         110 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref,ref,ref):ref
          87 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref,ref):ref
          66 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref):ref
          45 : System.Private.CoreLib.dasm - CustomAttributeTypedArgument:EncodedValueToRawValue(long,int):ref

Top method improvements by size (bytes):
        -845 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceArrayValue(int):ref:this
        -440 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceScalarValue(int,ref):int
        -426 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceScalarValue(int,ref):long
        -364 : System.Private.CoreLib.dasm - CustomAttributeBuilder:InitCustomAttributeBuilder(ref,ref,ref,ref,ref,ref):this
        -303 : System.Private.CoreLib.dasm - AppDomain:Setup(ref):ref

415 total methods with size differences.

@benaadams
Copy link
Member

Ah... should check the callers...

@benaadams
Copy link
Member

@jkotas no its a bad change for the item you highlighted as it marks everything using Environment:GetResourceString as uses stack crawl mark, so doesn't inline the caller 😞

Before

Successfully inlined ArgumentNullException:.ctor():this (28 IL bytes) (depth 1) [profitable inline]
Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 2) [below ALWAYS_INLINE size]
Successfully inlined ArgumentException:.ctor(ref):this (19 IL bytes) (depth 2) [profitable inline]
Successfully inlined SystemException:.ctor(ref):this (19 IL bytes) (depth 3) [profitable inline]
Successfully inlined Exception:.ctor(ref):this (20 IL bytes) (depth 4) [profitable inline]
Successfully inlined Object:.ctor():this (1 IL bytes) (depth 5) [below ALWAYS_INLINE size]
Successfully inlined Exception:SetErrorCode(int):this (8 IL bytes) (depth 4) [below ALWAYS_INLINE size]
Successfully inlined Exception:set_HResult(int):this (8 IL bytes) (depth 5) [below ALWAYS_INLINE size]
Successfully inlined Exception:SetErrorCode(int):this (8 IL bytes) (depth 3) [below ALWAYS_INLINE size]
Successfully inlined Exception:set_HResult(int):this (8 IL bytes) (depth 4) [below ALWAYS_INLINE size]
Successfully inlined Exception:SetErrorCode(int):this (8 IL bytes) (depth 2) [below ALWAYS_INLINE size]
Successfully inlined Exception:set_HResult(int):this (8 IL bytes) (depth 3) [below ALWAYS_INLINE size]
**************** Inline Tree
Inlines into 0600001C RuntimeType:SanityCheckGenericArguments(ref,ref)
  [0 IL=0003 TR=000154 06000D24] [FAILED: unprofitable inline] ArgumentNullException:.ctor():this
  [0 IL=0017 TR=000024 06002E5E] [FAILED: noinline per IL/cached result] Type:op_Equality(ref,ref):bool
  [1 IL=0024 TR=000051 06000D24] [profitable inline] RuntimeType:GetMethodBase(ref,ref):ref:.ctor():this
    [2 IL=0006 TR=000162 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
      [0 IL=0001 TR=000177 06000C92] [FAILED: unprofitable inline] Environment:GetResourceStringLocal(ref):ref
    [3 IL=0011 TR=000166 06002FB8] [profitable inline] ArgumentException:.ctor(ref):this
      [4 IL=0002 TR=000185 06000CE3] [profitable inline] SystemException:.ctor(ref):this
        [5 IL=0002 TR=000198 060033EF] [profitable inline] Exception:.ctor(ref):this
          [6 IL=0001 TR=000208 06001FD5] [below ALWAYS_INLINE size] Object:.ctor():this
          [0 IL=0007 TR=000211 060033ED] [FAILED: unprofitable inline] Exception:Init():this
        [7 IL=0013 TR=000203 06003400] [below ALWAYS_INLINE size] Exception:SetErrorCode(int):this
          [8 IL=0002 TR=000222 06003419] [below ALWAYS_INLINE size] Exception:set_HResult(int):this
      [9 IL=0013 TR=000190 06003400] [below ALWAYS_INLINE size] Exception:SetErrorCode(int):this
        [10 IL=0002 TR=000234 06003419] [below ALWAYS_INLINE size] Exception:set_HResult(int):this
    [11 IL=0022 TR=000171 06003400] [below ALWAYS_INLINE size] Exception:SetErrorCode(int):this
      [12 IL=0002 TR=000246 06003419] [below ALWAYS_INLINE size] Exception:set_HResult(int):this
  [0 IL=0033 TR=000035 0600001B] [FAILED: noinline per IL/cached result] RuntimeType:ThrowIfTypeNeverValidGenericArgument(ref)
  [0 IL=0089 TR=000129 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [0 IL=0094 TR=000140 06002FB8] [FAILED: unprofitable inline] ArgumentException:.ctor(ref):this
Budget: initialTime=363, finalTime=479, initialBudget=3630, currentBudget=3630
Budget: initialSize=2434, finalSize=3152

After

**************** Inline Tree
Inlines into 0600001C RuntimeType:SanityCheckGenericArguments(ref,ref)
  [0 IL=0003 TR=000130 06000D28] [FAILED: unprofitable inline] ArgumentNullException:.ctor():this
  [0 IL=0017 TR=000024 06002E62] [FAILED: noinline per IL/cached result] Type:op_Equality(ref,ref):bool
  [0 IL=0024 TR=000051 06000D28] [FAILED: uses stack crawl mark] ArgumentNullException:.ctor():this
  [0 IL=0033 TR=000035 0600001B] [FAILED: noinline per IL/cached result] RuntimeType:ThrowIfTypeNeverValidGenericArgument(ref)
  [0 IL=0082 TR=000116 06002FBC] [FAILED: unprofitable inline] ArgumentException:.ctor(ref):this
Budget: initialTime=327, finalTime=327, initialBudget=3270, currentBudget=3270
Budget: initialSize=2160, finalSize=2160

@jamesqo
Copy link
Author

jamesqo commented Sep 9, 2016

@benaadams Yeah, it's unfortunate that all methods in CoreLib marked NoInlining are automatically assumed to use StackCrawlMark (as pointed out by the code @jkotas linked to). Maybe we should consider introducing a new attribute, e.g. [UsesStackCrawlMark] and use that instead for those methods.

@benaadams
Copy link
Member

benaadams commented Sep 9, 2016

That's probably not the best example function as that actually might be better; as its a lot of exception stuff that's not inlined 😄

Will find something more mainstream

@benaadams
Copy link
Member

benaadams commented Sep 9, 2016

Ok, something that isn't an exception .ctor, that shows the issue

Before

Successfully inlined Decimal:.ctor(int,int,int,int):this (71 IL bytes) (depth 1) [profitable inline]
Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 2) [below ALWAYS_INLINE size]
**************** Inline Tree
Inlines into 0600180F Decimal:Abs(struct):struct
  [1 IL=0030 TR=000021 0600180E] [profitable inline] Decimal:.ctor(int,int,int,int):this
    [2 IL=0060 TR=000047 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
    [0 IL=0065 TR=000057 06002FB8] [FAILED: unprofitable inline] ArgumentException:.ctor(ref):this
Budget: initialTime=168, finalTime=296, initialBudget=1680, currentBudget=1680
Budget: initialSize=952, finalSize=1911

After

**************** Inline Tree
Inlines into 06001813 Decimal:Abs(struct):struct
  [0 IL=0030 TR=000021 06001812] [FAILED: uses stack crawl mark] Decimal:.ctor(int,int,int,int):this
Budget: initialTime=168, finalTime=168, initialBudget=1680, currentBudget=1680
Budget: initialSize=952, finalSize=952

So fairly major 😢

@benaadams
Copy link
Member

@jamesqo as NoInlining causes the callee and its caller to also to not be inlined in coreclr; if you remove the added MethodImplOptions.NoInlining from the new methods and move it to the method they call, I think you'll get the desired effect? (though for the wrong reasons)

So just adding it to

[MethodImpl(MethodImplOptions.NoInlining)]
internal static String GetResourceStringLocal(String key)

and

[MethodImpl(MethodImplOptions.NoInlining)]
internal static String GetResourceString(String key, params Object[] values)

Jit-Diff

Summary:
(Note: Lower is better)

Total bytes of diff: -17479 (-0.54 % of base)
    diff is an improvement.

Total byte diff includes 325 bytes from reconciling methods
        Base had    0 unique methods,        0 unique bytes
        Diff had    3 unique methods,      325 unique bytes

Top file improvements by size (bytes):
      -17479 : System.Private.CoreLib.dasm (-0.54 % of base)

1 total files with size differences.

Top method regessions by size (bytes):
         128 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref,ref,ref,ref):ref
         110 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref,ref,ref):ref
          87 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref,ref):ref
          63 : System.Private.CoreLib.dasm - Environment:GetResourceString(ref,ref):ref
          45 : System.Private.CoreLib.dasm - CustomAttributeTypedArgument:EncodedValueToRawValue(long,int):ref

Top method improvements by size (bytes):
        -845 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceArrayValue(int):ref:this
        -440 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceScalarValue(int,ref):int
        -426 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceScalarValue(int,ref):long
        -235 : System.Private.CoreLib.dasm - __Error:WinIOError(int,ref)
        -213 : System.Private.CoreLib.dasm - CLRIPropertyValueImpl:CoerceScalarValue(int,ref):ubyte

378 total methods with size differences.

@benaadams
Copy link
Member

Then the callers of the callers then go back to being inlined

Successfully inlined Decimal:.ctor(int,int,int,int):this (71 IL bytes) (depth 1) [profitable inline]
**************** Inline Tree
Inlines into 06001813 Decimal:Abs(struct):struct
  [1 IL=0030 TR=000021 06001812] [profitable inline] Decimal:.ctor(int,int,int,int):this
    [0 IL=0065 TR=000055 06002FBC] [FAILED: unprofitable inline] ArgumentException:.ctor(ref):this
Budget: initialTime=168, finalTime=296, initialBudget=1680, currentBudget=1680
Budget: initialSize=952, finalSize=1911
Successfully inlined Decimal:op_UnaryNegation(struct):struct (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Decimal:Negate(struct):struct (36 IL bytes) (depth 2) [profitable inline]
Successfully inlined Decimal:.ctor(int,int,int,int):this (71 IL bytes) (depth 3) [profitable inline]
Successfully inlined Decimal:Floor(struct):struct (9 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Decimal:op_UnaryNegation(struct):struct (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Decimal:Negate(struct):struct (36 IL bytes) (depth 2) [profitable inline]
Successfully inlined Decimal:.ctor(int,int,int,int):this (71 IL bytes) (depth 3) [profitable inline]
**************** Inline Tree
Inlines into 06001816 Decimal:Ceiling(struct):struct
  [1 IL=0001 TR=000002 06001865] [below ALWAYS_INLINE size] Decimal:op_UnaryNegation(struct):struct
    [2 IL=0001 TR=000038 06001838] [profitable inline] Decimal:Negate(struct):struct
      [3 IL=0030 TR=000074 06001812] [profitable inline] Decimal:.ctor(int,int,int,int):this
        [0 IL=0065 TR=000111 06002FBC] [FAILED: unprofitable inline] ArgumentException:.ctor(ref):this
  [4 IL=0006 TR=000008 06001821] [below ALWAYS_INLINE size] Decimal:Floor(struct):struct
    [0 IL=0002 TR=000167 06001822] [FAILED: cannot get method info] Decimal:FCallFloor(byref)
  [5 IL=0011 TR=000019 06001865] [below ALWAYS_INLINE size] Decimal:op_UnaryNegation(struct):struct
    [6 IL=0001 TR=000185 06001838] [profitable inline] Decimal:Negate(struct):struct
      [7 IL=0030 TR=000220 06001812] [profitable inline] Decimal:.ctor(int,int,int,int):this
        [0 IL=0065 TR=000256 06002FBC] [FAILED: unprofitable inline] ArgumentException:.ctor(ref):this
Budget: initialTime=111, finalTime=487, initialBudget=1110, currentBudget=1110
Budget: initialSize=518, finalSize=3112

@jkotas is this worth pursuing? Its the right results, but for the wrong reasons...

@benaadams
Copy link
Member

__Error:WinIOError as is a big changer moves from

Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Environment:GetResourceString(ref):ref (7 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
**************** Inline Tree
Inlines into 0600101A __Error:WinIOError(int,ref)
  [0 IL=0019 TR=000019 06001018] [FAILED: noinline per IL/cached result] __Error:GetDisplayablePath(ref,bool):ref
  [1 IL=0165 TR=000599 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
  [0 IL=0170 TR=000609 06000DC5] [FAILED: unprofitable inline] FileNotFoundException:.ctor(ref):this
  [0 IL=0191 TR=000577 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [0 IL=0197 TR=000589 06000DC7] [FAILED: unprofitable inline] FileNotFoundException:.ctor(ref,ref):this
  [2 IL=0216 TR=000534 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
  [0 IL=0221 TR=000544 0600100B] [FAILED: unprofitable inline] DirectoryNotFoundException:.ctor(ref):this
  [0 IL=0242 TR=000514 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [0 IL=0247 TR=000525 0600100B] [FAILED: unprofitable inline] DirectoryNotFoundException:.ctor(ref):this
  [3 IL=0266 TR=000471 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
  [0 IL=0271 TR=000481 06000D79] [FAILED: unprofitable inline] UnauthorizedAccessException:.ctor(ref):this
  [0 IL=0292 TR=000451 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [0 IL=0297 TR=000462 06000D79] [FAILED: unprofitable inline] UnauthorizedAccessException:.ctor(ref):this
  [0 IL=0329 TR=000181 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [4 IL=0335 TR=000187 06003F36] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0341 TR=000202 06000F90] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [5 IL=0352 TR=000044 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
  [0 IL=0357 TR=000054 06000F3A] [FAILED: unprofitable inline] PathTooLongException:.ctor(ref):this
  [0 IL=0378 TR=000406 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [0 IL=0383 TR=000417 06001009] [FAILED: unprofitable inline] DriveNotFoundException:.ctor(ref):this
  [0 IL=0390 TR=000120 06003F0D] [FAILED: unprofitable inline] Win32Native:GetMessage(int):ref
  [6 IL=0396 TR=000125 06003F36] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0402 TR=000140 06000F90] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [7 IL=0421 TR=000282 06000C93] [below ALWAYS_INLINE size] Environment:GetResourceString(ref):ref
  [8 IL=0427 TR=000287 06003F36] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0433 TR=000302 06000F90] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0454 TR=000250 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [9 IL=0460 TR=000256 06003F36] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0466 TR=000271 06000F90] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0495 TR=000343 06000C94] [FAILED: unprofitable inline] Environment:GetResourceString(ref,ref):ref
  [10 IL=0501 TR=000349 06003F36] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0507 TR=000364 06000F90] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0513 TR=000074 0600010E] [FAILED: unprofitable inline] OperationCanceledException:.ctor():this
  [0 IL=0520 TR=000083 06003F0D] [FAILED: unprofitable inline] Win32Native:GetMessage(int):ref
  [11 IL=0526 TR=000088 06003F36] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0532 TR=000103 06000F90] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
Budget: initialTime=1674, finalTime=1686, initialBudget=16740, currentBudget=16740
Budget: initialSize=12397, finalSize=12397

to

Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
Successfully inlined Win32Native:MakeHRFromErrorCode(int):int (8 IL bytes) (depth 1) [below ALWAYS_INLINE size]
**************** Inline Tree
Inlines into 06001032 __Error:WinIOError(int,ref)
  [0 IL=0019 TR=000019 06001030] [FAILED: noinline per IL/cached result] __Error:GetDisplayablePath(ref,bool):ref
  [0 IL=0170 TR=000473 06000DED] [FAILED: unprofitable inline] FileNotFoundException:.ctor(ref):this
  [0 IL=0188 TR=000455 06000DEF] [FAILED: unprofitable inline] FileNotFoundException:.ctor(ref,ref):this
  [0 IL=0212 TR=000428 06001023] [FAILED: unprofitable inline] DirectoryNotFoundException:.ctor(ref):this
  [0 IL=0229 TR=000411 06001023] [FAILED: unprofitable inline] DirectoryNotFoundException:.ctor(ref):this
  [0 IL=0253 TR=000385 06000D7D] [FAILED: unprofitable inline] UnauthorizedAccessException:.ctor(ref):this
  [0 IL=0270 TR=000368 06000D7D] [FAILED: unprofitable inline] UnauthorizedAccessException:.ctor(ref):this
  [0 IL=0293 TR=000163 06000C94] [FAILED: noinline per IL/cached result] Environment:GetResourceString(ref,ref):ref
  [1 IL=0299 TR=000167 06003F3A] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0305 TR=000182 06000FB8] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0321 TR=000052 06000F62] [FAILED: unprofitable inline] PathTooLongException:.ctor(ref):this
  [0 IL=0338 TR=000341 0600100D] [FAILED: unprofitable inline] DriveNotFoundException:.ctor(ref):this
  [0 IL=0345 TR=000118 06003F11] [FAILED: unprofitable inline] Win32Native:GetMessage(int):ref
  [2 IL=0351 TR=000123 06003F3A] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0357 TR=000138 06000FB8] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0376 TR=000244 06000C93] [FAILED: noinline per IL/cached result] Environment:GetResourceString(ref):ref
  [3 IL=0382 TR=000247 06003F3A] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0388 TR=000262 06000FB8] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0400 TR=000214 06000C94] [FAILED: noinline per IL/cached result] Environment:GetResourceString(ref,ref):ref
  [4 IL=0406 TR=000218 06003F3A] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0412 TR=000233 06000FB8] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0432 TR=000287 06000C94] [FAILED: noinline per IL/cached result] Environment:GetResourceString(ref,ref):ref
  [5 IL=0438 TR=000291 06003F3A] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0444 TR=000306 06000FB8] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
  [0 IL=0450 TR=000072 0600010E] [FAILED: unprofitable inline] OperationCanceledException:.ctor():this
  [0 IL=0457 TR=000081 06003F11] [FAILED: unprofitable inline] Win32Native:GetMessage(int):ref
  [6 IL=0463 TR=000086 06003F3A] [below ALWAYS_INLINE size] Win32Native:MakeHRFromErrorCode(int):int
  [0 IL=0469 TR=000101 06000FB8] [FAILED: unprofitable inline] IOException:.ctor(ref,int,ref):this
Budget: initialTime=1485, finalTime=1497, initialBudget=14850, currentBudget=14850
Budget: initialSize=10961, finalSize=10961

@jkotas
Copy link
Member

jkotas commented Sep 10, 2016

@jkotas is this worth pursuing?

If there is a comment explaining it, it is fine with me.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants