草庐IT

多任务loss优化

全部标签

c# - C# 编译器和 JIT 都做了哪些优化?

我将继续为我的编译器类开发C#编译器。目前,我几乎完成了教科书中有关编译器优化的章节。在大多数情况下,我的教科书在编写时并没有考虑到即时编译,我很好奇C#编译器执行的静态预jit优化与它在编写过程中执行的操作JIT流程?当我与人们谈论针对CLR进行编译时,我通常会听到诸如“大部分优化由JIT完成”之类的话。诸如循环展开、常量折叠/传播、指令交织之类的事情是由C#编译器在Jit前完成的还是由抖动处理的?如果它们不是由抖动处理的,那么抖动会进行什么样的优化,这是即时编译器所独有的? 最佳答案 我可以想象有许多JIT独有的优化;具体来说,

c# - 结合应用程序域远程处理和任务时出现死锁

我的应用程序需要将插件加载到单独的应用程序域中,然后在其中异步执行一些代码。我已经编写了一些代码来将Task包装在可编码类型中:staticclassRemoteTask{publicstaticasyncTaskClientComplete(RemoteTaskremoteTask,CancellationTokencancellationToken){Tresult;using(cancellationToken.Register(remoteTask.Cancel)){RemoteTaskCompletionSourcetcs=newRemoteTaskCompletionSou

c# - 为什么从 byte 到 sbyte 的转换会为优化代码提供错误的值?

安装NUnit3后,可以使用以下代码示例重现该问题。[TestFixture]publicclassSByteFixture{[Test]publicvoidTest(){vardata=newbyte[]{0xFF};sbytex=-128;data[0]=(byte)x;byteb1=data[0];varb2=(sbyte)b1;Assert.AreEqual(b1.ToString(),"128");Assert.AreEqual(b2.ToString(),"-128");}}该项目应该是一个类库,因为在控制台应用程序中它是不可复制的。应该启用优化,即csproj文件中的以下

c# - 为什么 `.Select(...).Last()` 被优化,而 `.Select(...).Last(...)` 没有被优化?

考虑以下枚举器:varitems=(newint[]{1,2,3,4,5}).Select(x=>{Console.WriteLine($"inspect{x}");returnx;});这会产生元素[1,2,3,4,5],在它们被消耗时打印出来。当我调用Last此枚举器上的方法,它会触发仅访问单个元素的快速路径:items.Last();inspect5但是当我将回调传递给Last时,它从头开始遍历整个列表:items.Last(x=>true);inspect1inspect2inspect3inspect4inspect5查看.NETCore源代码,我发现:Last(IEnume

c# - 我可以强制编译器优化特定方法吗?

是否有一个属性可以用来告诉编译器必须始终优化方法,即使未设置全局/o+编译器开关?我问的原因是因为我在玩弄基于现有方法的IL代码动态创建方法的想法;当代码经过优化时,我想做的操作相当容易,但在未优化的代码中变得非常困难,因为编译器生成了额外的指令。编辑:关于困扰我的非优化的更多细节......让我们考虑以下阶乘函数的实现:staticlongFactorialRec(intn,longacc){if(n==0)returnacc;returnFactorialRec(n-1,acc*n);}(注意:我知道有更好的方法来计算阶乘,这只是一个例子)启用优化后生成的IL非常简单:IL_000

c# - MSBuild 内联任务 - 引用非标准 Microsoft 程序集

我正在使用新的MSBuild内联任务来利用Microsoft.Web.Publishing.Tasks.dll程序集中的TransformXml(XDT转换)。这是我的任务(截图)的样子:...这可以很好地编译并加载DLL,但是,当它执行时失败,因为它试图在appbase路径中找到程序集,该路径是:C:\Windows\Microsoft.NET\Framework\v4.0.30319。我本以为它会看我给它的路径。Fusion日志显示:===Pre-bindstateinformation===\rLOG:User=xxx\Kamran\rLOG:DisplayName=Micros

c# - 如何在安装/卸载 ClickOnce 应用程序期间执行自定义任务?

有没有什么方法可以在安装或卸载ClickOnce应用程序期间运行自定义代码?这个问题之前有人问过here,但那是很久以前的事了,恕我直言,那里给出的答案非常笨拙,我有点希望VS的更高版本提供了更优雅的解决方案...... 最佳答案 查看以下文章:AdministeringClickOnceDeploymentsWalkthrough:CreatingaCustomInstallerforaClickOnceApplication 关于c#-如何在安装/卸载ClickOnce应用程序期间执

c# - 尝试优化模糊匹配

我有2,500,000个产品名称,我想尝试将它们组合在一起,即找到名称相似的产品。例如,我可以拥有三种产品:亨氏焗bean400g;HzBkdbean400g;亨氏bean400克。它们实际上是相同的产品,可以合并在一起。我的计划是使用Jaro–Winklerdistance的实现查找匹配项。该过程如下:列出内存中所有产品名称的大列表;选择列表中的第一个产品;将其与列表中紧随其后的每个产品进行比较并计算“Jaro分数”;任何匹配度高(比如0.95f或更高)的产品都会被报告;转到下一个产品。所以这有一些优化,因为它只以一种方式匹配每个产品,节省了一半的处理时间。我对此进行了编码并进行了测

c# - 使用 await-async 的最佳实践,从哪里开始任务?

我开始在我们的.NetWPF应用程序中使用await/async机制。在我的ViewModel中,我在服务上调用异步方法。我的问题是:是不是比较好直接在这个服务里面做一个大的returnawaitTask.Run(()=>{...});此服务上的所有子方法是否也是异步的,然后在其中有Task.Run?举例:1)publicclassService:IService{publicasyncTask(SomeParameterparameter){returnawaitTask.Run(()=>{CopyStuff(parameter.A);UpgradeStuff(parameter.B

c# - 多少任务太多了?

我目前正在开发一个依赖许多不同网络服务来获取数据的应用程序。因为我想模块化每个服务并在其中有一些依赖性(服务1必须在服务2和3等之前运行),所以我在其自己的任务中运行每个服务。任务本身是积极运行,这意味着他们正在向Web服务发送请求并等待响应或处理响应等待(通过监视器和超时)-一旦任务完成,所有等待任务都会唤醒并检查它们的依赖项是否已完成现在,系统以我所说的良好性能运行(特别是因为性能可以忽略不计)-然而,应用程序生成了相当多的任务。所以,对于我的问题:在这种情况下,大约200个任务是不是太多了?它们是否会产生那么多的开销,以至于基本上非线程方法会更好? 最