出于教育目的,我正在学习一些IL(主要是因为我很好奇发生了什么'%'在幕后(原来是rem)并开始离题......).
我写了一个方法,只是返回true来解决一些问题并且想知道'br.s'操作码:
.method public hidebysig static bool ReturnTrue() cil managed
{
// Code size 7 (0x7)
.maxstack 1
.locals init ([0] bool CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: br.s IL_0005
IL_0005: ldloc.0
IL_0006: ret
} // End of method Primes::ReturnTrue
Run Code Online (Sandbox Code Playgroud)
在ldc.i4.1在堆栈上推送1并且stloc.0将其放在第0个本地之后,br.s基本上(据我所知)在行IL_0005处对ldloc.0执行'goto'.
为什么是这样?为什么没有IL_0004线,所以这可以省略?
我有一个处理一些查询的方法A().这个方法,从开括号到返回语句之前,时间为+/- 70ms.其中50%来自打开连接,大约20%来自实际查询,5-10%用于某些内存访问,其余(可能)用于处理连接,命令和阅读器.
虽然用于处理连接的这一大块时间足够烦人,但更让我困扰的是当我从方法B()调用A()时:
B()
{
var timer = Stopwatch.Startnew()
A();
timer.Stop(); // elapsed: +/- 250ms
Debugger.Break();
}
Run Code Online (Sandbox Code Playgroud)
又增加了180毫秒的延迟,我似乎无法弄清楚原因.我已经尝试过A返回null,它什么都没改变.
唯一的磁盘I/O和网络发生在A中.我认为从磁盘和网络到本地内存的传输应该发生在A中,因此从B调用A不应该受此影响,但显然这不是案子?这是我遇到的网络延迟吗?如果是这样,那么为什么当我让B返回null时也会发生这种情况呢?
我目前没有其他解释......
A大致如下实现,就像访问数据库的任何简单方法一样.这是设计,但显示了基本的想法和流程:
A()
{
var totalTimer = Stopwatch.StartNew();
var stuff = new Stuffholder();
using(connection)
{
using(command)
{
using(reader)
{
// fill 'stuff'
}
}
}
totalTimer.Stop(); // elapsed: +/- 70ms
return stuff;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我希望得到一个价值
var guid = Guid.Parse("SOMEGUID-GUID-GUID-GUID-SOMEGUIDGUID");
Expression<Func<Someobject, bool>> selector = x => x.SomeId == guid;
Run Code Online (Sandbox Code Playgroud)
为了记录目的,我需要能够捕获那个guid.
我尝试了下面的代码,我觉得它与我正在寻找的有些接近,但并不完全.
BinaryExpression binaryExpression = (BinaryExpression)selector.Body;
MemberExpression memberExpression = (MemberExpression)((UnaryExpression)binaryExpression.Right).Operand;
ConstantExpression constantExpression = (ConstantExpression)memberExpression.Expression;
Run Code Online (Sandbox Code Playgroud)
现在,ConstantExpression公开了一个成员'Value',它确实包含了我正在寻找的东西,但我有点疑惑如何实际提取它.
和不:
var val = (Guid)constantExpression.Value;
Run Code Online (Sandbox Code Playgroud)
不起作用:)
解决了
最终结果如下:
BinaryExpression binaryExpression = (BinaryExpression)selector.Body;
MemberExpression memberExpression = (MemberExpression)((UnaryExpression)binaryExpression.Right).Operand;
var myGuid = Expression.Lambda(memberExpression).Compile().DynamicInvoke();
Run Code Online (Sandbox Code Playgroud)
跟进
我使用以下代码进行了一些粗略的速度测试:
static void Main(string[] args)
{
var id = Guid.Parse("bleh");
Expression<Func<Thingemebob, bool>> selector = x => x.Id == id;
var tickList = new List<long>();
for (int i = 0; i …Run Code Online (Sandbox Code Playgroud) 我正在实现一些异步工作并且无法帮助,但我觉得我最终会得到一个非常难看的构造,我想知道是否以及如何将其重写为"感觉更好"的东西.
var tasks = new List<Task>();
var t1 = new Task<Guid>(() => DoSomeStuff<Xyz>(dtx, e1, M1));
var t2 = new Task<Guid>(() => DoSomeStuff<Qrs>(dtx, e2, M2));
var t3 = new Task<Guid>(() => DoSomeStuff<Abc>(dtx, e3, M3));
tasks.Add(t1);
tasks.Add(t2);
tasks.Add(t3);
tasks.ForEach(x => x.Start());
Task.WaitAll(tasks.ToArray<Task>());
returnDto.t1value = t1.Result;
returnDto.t2value = t2.Result;
returnDto.t3value = t3.Result;
Run Code Online (Sandbox Code Playgroud)
为简洁起见,变量名称已被更改,实际上还有更多任务.任务都可以独立运行,但所有任务都必须在我们继续之前完成.
DoSomeStuff 看起来像这样:
private Guid DoSomeStuff<T>(DependentTransaction dtx, T thing, Func<T, Guid> method)
Run Code Online (Sandbox Code Playgroud) 在我们的数据模型中有一个Person.
一个人住在一所房子里.
一个人可以拥有一个"订阅".(与订阅构成的内容无关)
一个房子可以有一个'订阅'.
订阅具有SubscriptionNumber.
因此,这个数据模型允许Person直接订阅,也可以通过他们的House.
现在进行查询.
如果此人通过他们的房屋订阅,则与该订阅相关联的SubscriptionNumber需要以结果结束.如果不是这种情况,那么与订阅直接相关的订阅关联的SubscriptionNumber需要以结果结束(如果不存在则为NULL).
此查询的结果将显示在网格中.我们允许用户在此列上指定过滤和排序.这意味着一些事情:
1) We cannot simply specify a CASE in the 'main' select statement and alias that result,
because this disallows us to filter on it, since WHERE is processed before SELECT.
2) For the filtering to be meaningful the result has to be 'put' in one alias
Run Code Online (Sandbox Code Playgroud)
我是数据库开发的新手并且完全陷入困境,但这是我到目前为止所提出的:
1) Using a query like this:
SELECT
(CASE
WHEN (House of person has subscription)
THEN (return subscription number of house)
ELSE (return subscription number …Run Code Online (Sandbox Code Playgroud)