我对dynamicC#的性能有疑问.我读过dynamic让编译器再次运行,但是它做了什么?
是否必须dynamic使用用作参数的变量或仅具有动态行为/上下文的行重新编译整个方法?
我注意到使用dynamic变量可以将简单的for循环减慢2个数量级.
我玩过的代码:
internal class Sum2
{
public int intSum;
}
internal class Sum
{
public dynamic DynSum;
public int intSum;
}
class Program
{
private const int ITERATIONS = 1000000;
static void Main(string[] args)
{
var stopwatch = new Stopwatch();
dynamic param = new Object();
DynamicSum(stopwatch);
SumInt(stopwatch);
SumInt(stopwatch, param);
Sum(stopwatch);
DynamicSum(stopwatch);
SumInt(stopwatch);
SumInt(stopwatch, param);
Sum(stopwatch);
Console.ReadKey();
}
private static void Sum(Stopwatch stopwatch)
{
var sum = 0;
stopwatch.Reset();
stopwatch.Start();
for …Run Code Online (Sandbox Code Playgroud) 我想要一个将字符串映射到不同类型的通用列表的Dictionary.即以下列形式:
Key Value string List<T> string List<U> string List<V> string List<U> ...
目前我正在使用a Dictionary<string, IList>然后从每个字典KeyValuePair<string, IList> pair条目中提取强类型列表,如下所示:
Type layerType = pair.Value.GetType().GetGenericArguments()[0];
List<layerType> objectsClicked = pair.Value as List<layerType>;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
[编辑]正如已经注意到的,上面的内容没有编译,道歉 - 这就是当你在做某些事情的时候提出问题时所得到的.更多解释.我正在制作一个基本的空间数据查看器.最终视图由一组Layer<T>s组成.每个图层都提供一个委托来呈现其类型(给定偏移量和比例)以及检查其对象在当前窗口中的方式.对于命中测试,我希望每个图层的列表都被击中了对象.这份名单将是List<Point>一个Point层,等等......从所有命中的分组Layer<T>s就那么是强类型列表的集合.
我采用了在Visual Studio 2008中开发的应用程序,并通过COM Interop使用了各种Office库.我使用动态关键字和Visual Studio 2010开始了一些概念开发的证明.我发现执行相同的任务使用动态比使用"旧"方式慢大约5-10倍.有没有其他人经历过这种性能下降?这是已知还是我应该找到报告方式?
我正在考虑限制使用C#的dynamic关键字.我的初始时间试验令人惊讶 - 100,000次迭代的性能下降不到一秒(可能是由于DLR缓存).
但是,我无法访问内存分析器,Eric Lippert写道:
然后它启动DLR [...] DLR然后启动一个特殊版本的C#编译器......
这是什么内存占用,并在动态代码被垃圾收集时卸载?