简介:我从System.Threading.Tasks.Parallel.ForEach和Concurrent Data结构更改为简单的plinq(Parallel Linq)查询.加速是惊人的.
那么plinq固有地比Parallel.ForEach快吗?或者它是否特定于任务.
// Original Code
// concurrent dictionary to store results
var resultDict = new ConcurrentDictionary<string, MyResultType>();
Parallel.ForEach(items, item =>
{
resultDict.TryAdd(item.Name, PerformWork(source));
});
// new code
var results =
items
.AsParallel()
.Select(item => new { item.Name, queryResult = PerformWork(item) })
.ToDictionary(kv => kv.SourceName, kv => kv.queryResult);
Run Code Online (Sandbox Code Playgroud)
注意:每个任务(PerformWork)现在运行0到200毫秒.在我优化它之前,它需要更长的时间.这就是我在第一时间使用Tasks.Parallel库的原因.所以我从总时间的2秒到大约100-200毫秒的总时间,执行大致相同的工作,只是使用不同的方法.(哇linq和plinq太棒了!)
问题:
PLINQ主要基于功能风格的编程而没有副作用,而副作用正是TPL的用途.如果你想实际并行工作而不是仅仅并行搜索/选择事物,你可以使用TPL.
我可以假设,因为我的模式基本上是功能性的(给输入产生没有突变的新输出),plinq是正确使用的技术吗?
我正在寻找验证我的假设是正确的,或者表明我错过了什么.
我有一个EMF文件.我想把它缩小一点.
如何在.net(或使用任何工具)中执行此操作而不会出现模糊图像?
生成的已调整大小的图像将转换为另一种格式(png/jpg /无论如何),我可以处理(我认为).
我还没有在.Net(或任何语言平台)中找到一个处理emf/metafiles的明确例子.
我用GDI +查看了图形编程,但它只介绍了Metafiles.
我已经尝试了Image Magick,但你必须转换为另一种格式(我还需要做),结果很模糊(例如缩小并转换为png).
我已经尝试过Inkscape,但是你只能导入一个EMF文件而Inkscape将它倒置 并且不成比例地导入到现有的绘图中.
另外,(不要笑)我已经在Window's Paint中打开了它(为数不多的将打开emf的图像编辑软件程序之一)并调整了绘图大小,再次模糊.
更新:这是我用来调整大小的代码.
这样可行,但生成的图像模糊不清.代码只是一个通用的图像重新调整例程,不是特定于EMF的
private static Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = …Run Code Online (Sandbox Code Playgroud) 我在性能测试期间遇到了这个问题.
使用x86平台标志编译C#控制台应用程序时,未设置Large Address Aware标志:
dumpbin/headers app.exe的输出:
Dump of file app.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
3 number of sections
569F0089 time date stamp Tue Jan 19 21:35:37 2016
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
Run Code Online (Sandbox Code Playgroud)
将标志设置为"Any Cpu"时,生成的exe是Large Address Aware:
Dump of file app.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
3 …Run Code Online (Sandbox Code Playgroud) 我正在努力学习clojure.ClojureBox似乎与LispBox类似 - 我以前使用的http://gigamonkeys.com/lispbox/.
我正在寻找一个关于使用emacs的特定clojure特定教程,因为它配置了clojurebox.
以下是我的一些具体问题:
连接到 Sql Server 时,您可以在连接字符串中包含“应用程序”或“应用程序名称”。这使得跟踪共享用户名/密码的应用程序变得非常容易。
一个很好的用途是 Sql Server Profiler。您可以按应用程序过滤。这在过去对我们很有帮助。
但是,我无法为 Oracle 找到类似的东西。
在 Oracle 中是否有等效于 SQL Server 的“应用程序名称”连接字符串参数?
如果相关,我们正在使用 Oracle 提供的 .NET 驱动程序(显然通过 .NET/C# 连接)。
在Visual Studio 2012 RC上安装Visual Studio 2012 RTM并创建新的ASP.Net空Web应用程序项目后,我无法将新的Web窗体添加到我的项目中.尝试添加新的Web窗体时,我收到错误消息:
找不到路径的一部分....\WebForm.zip\WebForm.vstemplate
此问题在此处的连接站点上列出:
https://connect.microsoft.com/VisualStudio/feedback/details/758581/could-not-find-itemtemplate-path
我不能在那里注册解决方法,所以我打算在这里做,所以希望其他人可以找到它.(任何人都知道为什么d @mnded寄存器链接不起作用?)
更新:我还必须为类模板执行此操作:(我的路径)
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\ide\ItemTemplatesCache\web\csharp\1033\Class
Copied the Class folder and renamed it Class.zip
Run Code Online (Sandbox Code Playgroud)
.
在这个例子中,我必须将数组转换为字符串以使用内置的String.Compare方法.
char[] array = {'a','b','c'};
string s = "abc";
// here is the extra string allocation
var arrayString = new String(array);
var compareResult = String.Compare(s, arrayString);
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以将字符串与char数组进行比较而无需额外的字符串分配?
注意:我需要比较语义,我需要"[a] 32位有符号整数,表示两个比较之间的词汇关系."
小于零 - > strA小于strB.
零 - > strA等于strB.
大于零 - > strA大于strB.
(我在循环中进行这种比较,并且我使用额外的字符串分配生成了大量额外的垃圾(基于输入的大小为25-100MB)_.
我想我最终可能会弄脏自己,只是自己编写代码.
我正在尝试使用 C# 监视另一个进程的内存。但是,Process.WorkingSet64 或 Process.PrivateMemorySize64 将输出的最大内存值为 4294967295。性能计数器也有同样的问题。
这是我的代码:
using System;
using System.Diagnostics;
namespace perfmon
{
class Program
{
static void Main(string[] args)
{
int pid;
if (int.TryParse(args[0], out pid))
{
var p = Process.GetProcessById(pid);
var ramCounter = new PerformanceCounter("Process", "Working Set", p.ProcessName);
Console.WriteLine($"ProcessName:{p.ProcessName}");
var ram = ramCounter.NextValue();
p.Refresh();
Console.WriteLine("WorkingSet64\tPrivateMemorySize64\tRam PC");
Console.WriteLine($"{p.WorkingSet64}\t{p.PrivateMemorySize64}\t\t{ram}");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在带有 .net 4.61 的 Windows Server 2012 R2 上运行。
输出:
C:\XXX\perfmon>perfmon.exe 15800
ProcessName:XXX.Windows.Services
WorkingSet64 PrivateMemorySize64 Ram PC
4294967295 4294967295 4.294967E+09
Run Code Online (Sandbox Code Playgroud)
进程的 Powershell 输出: …