我已经知道设置字段比设置局部变量要慢得多,但是看起来设置带局部变量的字段比用字段设置局部变量慢得多.为什么是这样?在任何一种情况下都使用该字段的地址.
public class Test
{
public int A = 0;
public int B = 4;
public void Method1() // Set local with field
{
int a = A;
for (int i = 0; i < 100; i++)
{
a += B;
}
A = a;
}
public void Method2() // Set field with local
{
int b = B;
for (int i = 0; i < 100; i++)
{
A += b;
}
}
}
Run Code Online (Sandbox Code Playgroud)
10e + 6次迭代的基准测试结果如下: …
我有一种情况,我会遇到很多重复的字符串,这些字符串会在内存中持续很长时间.我想使用,String.Intern但我不想入侵任何潜在的应用程序资源,因为我的项目是一个库.这是如何运作的?
显然ITuple是内部的,禁用诸如此类的解决方案typeof(ITuple).IsAssignableFrom(type).另外,确定Tuple<>直到最有效的方法是Tuple<,,,,,,,>什么?没有类型名称比较的解决方案是优选的.
这是一个愚蠢的问题.我正在使用System.Single的解析函数,它表现出意想不到的可能是因为我不太了解浮点数.System.Single.MaxValue的MSDN页面声明最大值为3.402823e38,标准格式为
340282300000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
如果我使用这个字符串作为Parse()方法的参数,它将成功没有错误,如果我将任何零更改为任意数字它仍然会成功而没有错误(虽然它似乎忽略它们查看结果) .根据我的理解,这超出了限制,所以我错过了什么?
当我删除Ldstr "a"和Call Console.WriteLine(之前Ret)时,代码运行正常,否则InvalidProgramException在调用时抛出.这是否意味着需要一个空的评估堆栈?
class Program
{
delegate void Del();
static void Main(string[] args)
{
DynamicMethod dynamicMethod = new DynamicMethod("", null, Type.EmptyTypes);
ILGenerator ilGen = dynamicMethod.GetILGenerator();
ilGen.Emit(OpCodes.Ldstr, "a");
ilGen.BeginExceptionBlock();
ilGen.Emit(OpCodes.Ldstr, "b");
ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string) }, null));
ilGen.BeginCatchBlock(typeof(Exception));
ilGen.EndExceptionBlock();
ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string) }, null));
ilGen.Emit(OpCodes.Ret);
((Del)dynamicMethod.CreateDelegate(typeof(Del))).Invoke();
}
}
Run Code Online (Sandbox Code Playgroud) 我主要遵循这种IDisposable模式,对于大多数合理的课程.但ReaderWriterLockSlim让我质疑应用这种模式的可行性.一切ReaderWriterLockSlim.Dispose都是关闭一些事件句柄.那么Dispose资源这么少的班级有多重要呢?在这种情况下,我真的不介意GC是否必须等待另一轮非完整资源的终结者才能完成.
IDisposable然而,应用模式的结果是相当大的,每个使用一次性类的类现在也必须实现IDisposable.在我的特定情况下,我正在实现一个包装器HashSet.我并不特别期望处理这种物体的要求,因为它意外地使用了同步器.
在这种情况下,有没有理由不违反一次性模式?虽然我很渴望,但我不会在实践中这样做,因为违反一致性要差得多.
据我了解,在线程中止生效之前,必须完成 finally 块。应该出于什么目的Thread.BeginCriticalRegion而使用,冒着终止应用程序域的风险?
例子:
try
{
}
finally
{
CriticalOperation();
}
Run Code Online (Sandbox Code Playgroud)
或者
Thread.BeginCriticalRegion();
CriticalOperation();
Thread.EndCriticalRegion();
Run Code Online (Sandbox Code Playgroud) WMIC的CPU别名返回一个名为ProcessorType的值,MSDN声明有6个可能的值:
1 (0x1) Other
2 (0x2) Unknown
3 (0x3) Central Processor
4 (0x4) Math Processor
5 (0x5) DSP Processor
6 (0x6) Video Processor
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/aa394373(v=vs.85).aspx
3以外的任何类型的处理器是否可以作为主(或唯一)处理器?我正在编写硬件哈希函数,除非缺少通用处理器,否则我不想包含专用处理器.
给定一个空的构造函数,例如:
internal C()
{
}
Run Code Online (Sandbox Code Playgroud)
是否需要创建对象?它应该只包含一个返回操作,所以理论上它可以被丢弃,对吧?
注:很清楚,我,对于每个类,一个隐含的构造函数存在.然而,这个问题的意图是; 如果CLR只调用具有return操作的构造函数.
我正在尝试转换Single为Double保持原始值.我找到了以下方法:
Single f = 5.2F;
Double d1 = f; // 5.19999980926514
Double d2 = Double.Parse(f.ToString()); // 5.2 (correct)
Run Code Online (Sandbox Code Playgroud)
这种做法值得推荐吗?我不需要最佳方法,但必须将预期值传递给double.在双倍中存储舍入值是否会产生影响?
c# ×9
.net ×7
constructor ×1
cpu ×1
dispose ×1
double ×1
field ×1
hardware ×1
idisposable ×1
msdn ×1
performance ×1
reflection ×1
tuples ×1
windows ×1
wmi ×1