这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster.
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c) …
Run Code Online (Sandbox Code Playgroud) 使用反射器经历了一些框架类,并注意到许多方法和属性具有以下属性
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
Run Code Online (Sandbox Code Playgroud)
我很确定我在其他地方也看到了上述评论,从未跟进过.
有人可以告诉我这在C#和其他任何背景下意味着什么?
Array.Copy和Buffer.BlockCopy都做同样的事情,但是BlockCopy
针对快速字节级原始数组复制,而是Copy
通用实现.我的问题是 - 在什么情况下你应该使用BlockCopy
?您是否应该在复制基本类型数组时随时使用它,或者只有在编写性能时才使用它?使用Buffer.BlockCopy
结束有什么固有的危险Array.Copy
吗?
正如在另一个问题中所解释的,如果方法设置了TargetedPatchingOptOutAttribute,则通常只允许Ngen跨组件内联方法.
但是,通过使用DependencyAttribute,对于硬绑定程序集也是如此吗?LoadHint.Always
编辑:也许我的初始问题的答案是否定的,否则TargetedPatchingOptOutAttribute
在mscorlib中使用它是没有意义的,因为这个程序集总是硬绑定(它设置了DefaultDependencyAttribute).所以我想重新解释一下我的问题:是否可以在TargetedPatchingOptOutAttribute
组件的原生图像中内联方法?
在.NET中众所周知,类型不是垃圾收集,这意味着如果你正在玩f.ex. Reflection.Emit,你必须要小心卸载AppDomains等等......至少我是如何理解事情是如何运作的.
这让我想知道泛型类型是否是垃圾收集的,更准确一点:用MakeGenericType
例如基于用户输入创建的泛型.:-)
所以我构建了以下测试用例:
public interface IRecursiveClass
{
int Calculate();
}
public class RecursiveClass1<T> : IRecursiveClass
where T : IRecursiveClass,new()
{
public int Calculate()
{
return new T().Calculate() + 1;
}
}
public class RecursiveClass2<T> : IRecursiveClass
where T : IRecursiveClass,new()
{
public int Calculate()
{
return new T().Calculate() + 2;
}
}
public class TailClass : IRecursiveClass
{
public int Calculate()
{
return 0;
}
}
class RecursiveGenericsTest
{
public static int CalculateFromUserInput(string str)
{ …
Run Code Online (Sandbox Code Playgroud) Func<...>
在使用继承和泛型时,我一直无法理解在整个代码中使用的性能特征- 这是我发现自己一直使用的组合.
让我从一个最小的测试用例开始,这样我们都知道我们在谈论什么,然后我会发布结果,然后我将解释我期望的内容以及为什么......
最小的测试用例
public class GenericsTest2 : GenericsTest<int>
{
static void Main(string[] args)
{
GenericsTest2 at = new GenericsTest2();
at.test(at.func);
at.test(at.Check);
at.test(at.func2);
at.test(at.Check2);
at.test((a) => a.Equals(default(int)));
Console.ReadLine();
}
public GenericsTest2()
{
func = func2 = (a) => Check(a);
}
protected Func<int, bool> func2;
public bool Check2(int value)
{
return value.Equals(default(int));
}
public void test(Func<int, bool> func)
{
using (Stopwatch sw = new Stopwatch((ts) => { Console.WriteLine("Took {0:0.00}s", ts.TotalSeconds); }))
{
for (int i = 0; i < 100000000; …
Run Code Online (Sandbox Code Playgroud) .net ×5
c# ×3
generics ×2
ngen ×2
performance ×2
arrays ×1
c++ ×1
inheritance ×1
java ×1
optimization ×1
types ×1