例如:
ConcurrentDictionary<string,Payload> itemCache = GetItems();
foreach(KeyValuePair<string,Payload> kvPair in itemCache)
{
if(TestItemExpiry(kvPair.Value))
{ // Remove expired item.
Payload removedItem;
itemCache.TryRemove(kvPair.Key, out removedItem);
}
}
Run Code Online (Sandbox Code Playgroud)
显然,对于普通的Dictionary,这将引发异常,因为删除项会在枚举的生命周期中更改字典的内部状态.我的理解是,并非ConcurrentDictionary的情况,因为提供的IEnumerable处理内部状态更改.我明白了吗?有更好的模式可供使用吗?
我正在寻找C#中的并行化(多线程)排序算法的简单实现,它可以在List<T>
Arrays上运行,也可能使用Parallel Extensions,但这部分并不是绝对必要的.
编辑:Frank Krueger提供了一个很好的答案,但我希望将该示例转换为不使用LINQ的示例.还要注意,Parallel.Do()
似乎已被取代了Parallel.Invoke()
.
谢谢.
我有两个列的巨大表:Id和Title.我是bigint,我可以自由选择Title列的类型:varchar,char,text等等.列标题包含随机文本字符串,如"abcdefg","q","allyourbasebelongtous",最多255个字符.
我的任务是通过给定子字符串获取字符串.子串也具有随机长度,可以是字符串的开始,中间或结尾.最明显的执行方式:
SELECT * FROM t LIKE '%abc%'
Run Code Online (Sandbox Code Playgroud)
我不关心INSERT,我只需要做快速选择.我该怎么做才能尽快进行搜索?
我使用MS SQL Server 2008 R2,全文搜索将毫无用处,据我所知.
sql sql-server full-text-search query-optimization sql-server-2008-r2
我有一个类'数据库',作为ADO.net的包装器.例如,当我需要执行一个过程时,我调用Database.ExecuteProcedure(procedureName,parametersAndItsValues).
我们遇到了SQL Server 2000中死锁情况的严重问题.我们团队的一部分正在处理sql代码和事务以最小化这些事件,但我正在考虑使这个数据库类能够抵御死锁情况.
我们希望死锁受害者可能在经过一段时间的延迟后重试,但我不知道是否可能.这是我们使用的方法的代码:
public int ExecuteQuery(string query)
{
int rows = 0;
try
{
Command.Connection = Connection;
Command.CommandType = CommandType.Text;
if(DatabaseType != enumDatabaseType.ORACLE)
Command.CommandText = query;
else
Command.CommandText ="BEGIN " + query + " END;";
if (DatabaseType != enumDatabaseType.SQLCOMPACT)
Command.CommandTimeout = Connection.ConnectionTimeout;
if (Connection.State == ConnectionState.Closed)
Connection.Open();
rows = Command.ExecuteNonQuery();
}
catch (Exception exp)
{
//Could I add here any code to handle it?
throw new Exception(exp.Message);
}
finally
{
if (Command.Transaction == null)
{
Connection.Close();
_connection.Dispose();
_connection …
Run Code Online (Sandbox Code Playgroud) 我使用的是SQL Server 2005.我有三个表 - Users,Groups和GroupUsers.GroupUsers包含用于多对多关系的两个PK.
我有一个视图来获取组的所有用户信息,如下所示:
SELECT * FROM GroupUsers JOIN Users ON GroupUsers.UserID = Users.UserId
Run Code Online (Sandbox Code Playgroud)
我想创建此视图的反转 - 我想要一个未附加到特定组的所有用户的列表.以下查询将完成此任务:
SELECT * FROM Users WHERE UserID NOT IN
(SELECT UserID FROM GroupUsers WHERE GroupID=@GroupID)
Run Code Online (Sandbox Code Playgroud)
但是我不想指定组,我想知道如何将其转换为加入GroupID然后是UsersID和所有用户信息的视图,但仅限于非连接用户.
我不知道如何做到这一点,也许是EXCEPT运算符的东西?
更新:
我认为这是我的解决方案,除非有人想出更好的东西:
SELECT
G.GroupId,
U.*
FROM
Groups G
CROSS JOIN
Users U
WHERE
U.UserId NOT IN
(
SELECT
UserId
FROM
GroupUsers
WHERE
GroupId=G.GroupId
)
Run Code Online (Sandbox Code Playgroud) 我对SQL Server 2008的FILESTREAM功能有一些疑问.
使用FILESTREAM功能返回从SQL Server 2008流式传输的文件与直接从共享目录访问文件的性能差异是什么?
如果100个用户在10秒窗口内请求100个100Mb文件(通过FILESTREAM存储),SQL Server 2008的性能是否会慢慢爬行?
我正在寻找有关.NET应用程序何时以及如何共享加载程序集的更多详细信息.我有兴趣在OS进程之间共享,也在同一进程内的AppDomains之间共享.共享程序集通过避免在内存中具有相同程序集的多个副本来减少系统内存使用量,我认为这是主要的好处,但有兴趣知道是否存在其他好处和/或影响.
到目前为止我学到的内容摘要......
Sysinternals进程资源管理器可用于列出.NET进程的AppDomain以及加载到每个AppDomain中的程序集.
.NET进程似乎总是将"核心"程序集加载到名为"SharedDomain"的AppDomain中(假设这在当前进程中的AppDomain之间共享是合理的).
任务管理器和Process Explorer报告"工作集共享"和"工作集可共享"的内存使用数量不是无关紧要,但不清楚共享的内容.(它是共享AppDomain中的'核心'程序集吗?其他[非核心]程序集是否也共享?
在一个简单的测试中,我推出了两个独立的.NET应用程序副本,并为每个应用程序附加了一个Visual Studio调试器."模块"视图显示已加载的程序集及其在内存中的地址.在我的测试用例中,每个加载的模块都位于两个进程中的相同地址.(这是否表示共享,或者这个虚拟地址空间是否必须共享?)
ASP.NET 4.5通过一个叫做装配实习机制支持组件的共享(见看在ASP.NET 4.5共享通用组件,分享共同组件,与aspnet_intern.exe共享通用组件).它似乎通过设置文件系统符号链接(符号链接)来工作,以便不同的Web应用程序指向共享bin文件夹,因此这就提出了一个问题,即ASP.NET是否只是使用符号链接来触发.NET中的标准程序集共享行为,或者是否有更具体的ASP.NET和IIS AppPools正在进行.
注意.在安装了Visual Studio 2013的计算机上,可以在以下位置找到aspnet_intern.exe:
C:\ Program Files(x86)\ Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1工具\
在更高版本的.NET和Windows Server中,ASP.NET启动时间和内存使用情况有了进一步的改进; 请参阅ASP.NET应用程序暂停 - 响应式共享.NET Web主机,.Net 4.5中的ASP.NET共享主机方案的性能改进,但我不确定这些更改与此问题的相关性如何.
ASP.NET程序集共享也包含在.NET 4.5简介中.
还想知道JITted代码是否共享,因为加载的程序集由MSIL,资源,元数据等组成,并且当代码被JIT时必须分配更多内存.
在紧凑框架中也有关于汇编共享的讨论(我们相信共享,MSDN博客,Abhinaba Basu)
--- UPDATE ---
我使用sysinternals VMMap工具来检查两个AppPools,一个用asp.net程序集internign设置,另一个没有.我还"触摸"了一个测试aspx页面,导致ASP.NET加载所有程序集(并且global.asax运行少量代码,因此导致一些JITting).
报告的两个AppPools的内存使用数据非常相似,工作集,WS Private和WS Shareable基本相同.但是,在"实习"AppPool中,WS Shared要大得多.这是意外的(对我来说),因为没有其他进程可以与之共享,但VMMap显示的是内存块(标记为'.text'并具有执行/读保护),这些内存块在实习AppPool中显示为共享内存,而另一个AppPool中的相同程序集不共享.我对此的解释是,进程中的虚拟内存块被映射到同一物理内存,然后报告为"WS Shared".
ASLR
关于装配空间布局随机化.VMMap工具显示许多类型为"Image(ASLR)"的内存块.ASLR随机化了内存中程序集的位置以阻止恶意软件,我想知道这是否会阻止程序集实习工作正常.使用EMET工具禁用机器的ASLR 会导致程序集地址更加规则,但不会更改报告的内存数,因此它似乎不会影响程序集实习.值得注意的是VMMap仍然显示带有'ASLR'的图像,我怀疑这只是意味着装配/图像被标记为支持/允许ASLR,而不是ASLR生效.
我最近使用进程外会话状态对ASP.NET应用程序进行了一些性能测试和分析 - 这在Web场上使用会话状态时是必要的,这样可以在任何Web服务器上检索状态,例如,如果后续HTTP请求到达不同的服务器,因为会话不是"粘性"或原始服务器已关闭等.
让我感到惊讶的是,当我满负荷运行Web服务器并分析CPU使用率时,99%的CPU时间用于序列化和反序列化会话状态.随后我们实现了一个定制的"缓存"状态服务器; 这总是序列化状态,但也保持状态在内存中,这样如果你使用粘性会话,状态不必在大多数时间反序列化.这使服务器吞吐量提高了2倍; 但是,序列化仍然占CPU时间的98%或更多.
我们通过在序列化之前"修剪"会话状态中对象之间不必要的对象引用来获得速度的进一步改进 - 在反序列化时手动修复引用.这种速度提高了10-20%左右.这里的原因是一些性能损失是由于内置的序列化必须遍历对象指针的图形,这变成了一个更复杂的任务,有更多的指针.
继续调查,我们为一些类编写了自定义序列化例程,而不是依赖于.Net的内置序列化.我们发现,性能大大提高了约50倍.似乎CPU负载的大部分是由内置的.Net序列化引起的,而后者由于依赖于使用Reflection来遍历对象指针/图形并提取字段数据而变慢.
将我们的性能提高50倍是非常诱人的,因此将网络服务器硬件要求降低了很多(并且功率要求较低但仍然很重要).目前的选项是:
1)编写自定义序列化.由于任务的复杂性及其产生的维护开销,这是一个问题,也就是说,对类状态的任何更改都需要更改序列化/反序列化例程.
2)一些第三方解决方案.也许某些产品在构建时自动生成状态保存/加载代码,因此无需使用Reflection.
我很想知道是否有人知道第三方解决方案,或者遇到过这个问题,因为我没有从互联网搜索中找到任何提及它的内容.
更新:有些人建议在默认的内置序列化和纯自定义序列化例程之间采用一种中途解决方案.我们的想法是为最能影响性能的类实现自定义序列化,例如重写ISerializable.这是一种有趣且有前景的方法; 但是,我仍然认为可以完全替换内置序列化而无需编写和维护任何自定义代码 - 这在运行时无法完成,因为查询对象和访问私有数据需要Reflection.但理论上可以对已经构建的程序集进行后处理,并将新方法作为额外的构建步骤注入.一些分析器使用此方法在C#编译器构建之后将分析代码注入到程序集中.此外,我/我/我在某处读到.Net框架支持将方法注入到类中 - 因此可能需要处理IL的所有问题.
Mono是否支持XAML?
具体来说,我正在考虑转而使用XAML进行新的GUI工作,但我也喜欢将我的个人项目保存在Mono中.我现在应该坚持使用普通的旧System.Windows.Forms吗?
.net ×5
sql-server ×3
asp.net ×2
c# ×2
performance ×2
sql ×2
.net-2.0 ×1
ado.net ×1
appdomain ×1
concurrency ×1
deadlock ×1
filestream ×1
join ×1
mono ×1
reflection ×1
sorting ×1
t-sql ×1
xaml ×1
xml ×1
xquery ×1
xslt ×1