我计划在其中开发一个包含数万个对象的系统,每个对象最多可以有42个(但更可能是大约4或5个),它们可能会定期执行单独的操作.我还计划编写代码来停用定时器,直到对象开始使用.空闲时,对象每个只需要1个计时器,但是当激活时,其他计时器将立即启动.起初,对象的数量很少,可能只有几百个,但我预计它会成倍增长,并在几个月内开始达到成千上万.
因此,我非常担心我将为计时器和这些对象编写的代码的效率.我可以在三个级别编写此应用程序,这将成功执行所需的任务.此外,我计划在四核服务器上运行此系统,因此我希望尽可能使用多线程.
为此,我决定使用System.Timers.Timer类的时候触发一个新的线程为每个经过的事件.
这些是我正在考虑的3个级别:
一个单定时器操作整个应用程序,它通过每个迭代对象,检查,看看是否有任何其他动作需要被解雇,如果是这样,运行它们,然后移动到下一个.
多层计时器,其中每个对象都有一个主计时器,用于检查对象可能需要执行的所有功能,运行任何准备好的计时器,然后将下一个计时器间隔设置为下一个所需的操作时间.
递归级定时器,其中每个对象中的每个动作都有它自己的定时器将被触发,然后设置为下一次将可运行.
选项1的问题在于,如此多的对象和动作,以这种方式经过的一个单一计时器可能会运行大约20多秒(当它执行几百万行循环代码时),这应该每1秒滴答一次.如果对象未保持同步,则系统可能无法正常工作.
选项2的问题在于它比选项3更难写,但不是很多,它也意味着可能在系统上运行10,000个可能的定时器(每个对象一个),创建和销毁每个对象的线程过去就像没有人的生意(我不确定这是否是一个问题).每个定时器将不得不在这种情况下,每秒至少一次火,也许几百行代码(在极端情况下可达也许一千)上运行.
选项3的问题在于可能引入系统的大量定时器.我说的是平均10,000多个计时器,可能同时运行近100,000个计时器.每个过去的事件可能只需要运行50行或更少的代码行,这使得它们非常短.经过事件会对在另一个极端,五分钟一百分之一秒之间的延迟,平均可能是1秒左右.
我精通Visual Basic .NET,并计划在其中编写它,但我也可以恢复到我的高中时代,并尝试用C++编写这个以提高效率,如果它会产生很大的不同(请让我知道你是否有任何语言代码效率的来源).还在玩集群Linux服务器而不是我的四核Windows服务器上运行它的概念,但我不确定我是否可以让我的任何.NET应用程序在这样的Linux集群上运行(会喜欢任何信息)在那上面).
这个主题的主要问题是:
我是否使用选项1,2或3,为什么?
〜考虑评论后编辑〜
所以第四个选项涉及带有自旋锁的定时器轮.这是一个工作班:
Public Class Job
Private dFireTime As DateTime
Private objF As CrossAppDomainDelegate
Private objParams() As Object
Public Sub New(ByVal Func As CrossAppDomainDelegate, ByVal Params() As Object, ByVal FireTime As DateTime)
objF = Func
dFireTime = FireTime
objParams = Params
End Sub
Public ReadOnly Property FireTime()
Get
Return dFireTime
End Get
End Property
Public ReadOnly Property Func() As CrossAppDomainDelegate
Get
Return objF
End Get
End …Run Code Online (Sandbox Code Playgroud) 我正在编写一些数据加载代码,用于从oracle数据库中的大型慢表中提取数据.我具有对数据的只读访问权限,并且无法以任何方式更改索引或影响查询速度.
我的select语句需要5分钟才能执行,并返回大约300,000行.系统不断插入大批新记录,我需要确保每个最后一个记录,所以我需要保存上次下载数据时的时间戳.
我的问题是:如果我的select语句运行了5分钟,并且在select运行时插入了新行,我是否会在查询结果中收到新行?
我的直觉告诉我,答案是"不",特别是因为这5分钟的大部分时间只是从数据库到本地环境的数据传输所花费的时间,但我找不到关于方案的任何直接文档.
我已经在这个网站上工作了很长一段时间,我觉得我觉得它看起来很漂亮.但是我注意到IE8上的主页有问题(没有其他浏览器有我使用的这个问题)
在IE8中,该网站看起来像这样: 
注意最右边两侧的蓝色条纹,它们显示了它的宽度<td>.其中的内容应该是160px,但它<td>本身比它应该更宽.正如您在左侧的HTML分析器中看到的那样,宽度设置为"160",但页面中的HTML表示:
<td style="width: 160px;max-width:160px"width="160px"align="center"valign="top">
Run Code Online (Sandbox Code Playgroud)
出于绝望,我明显地尝试了一些事情.为什么IE继续讨厌我?我可以写什么代码让IE玩得像其他浏览器一样好玩?
如果您想挖掘源代码,实际站点URL是http://EpicClanWars.com.