我说不,伙伴说是的.我们都很固执.我们将测试,但我需要一些弹药来支持我的情况,即下面的伪代码不是那么大的瓶颈.我们正在做的是运行两个查询.第一个是针对一个大表(100k记录),下面称为BigTable.然后,我们采取我们发现的(通常是30个左右的记录)并运行这些记录(在一个循环中,参见下面的第二个'foreach')对一个名为SmallTable的小得多的表,通常有大约200条记录.我的合作伙伴希望将在SmallTable中找到的记录组合在一起,以便它们出现在BigTable的记录中,但如果这样做,则会失去灵活性,数据库不再处于正常状态.我的伴侣说他不关心普通形式,并声称以下是瓶颈.帮助我赢得这场战斗!当然,我的后备位置将是"让我们测试并看到",但我现在可以使用一些火力.我们期望每秒10个请求(在这种情况下可能是瓶颈,如果有的话,是微不足道的)或高达1500秒(这可能会破坏我们的应用程序在其他地方!大声笑.但我们是乐观主义者).
平台:Microsoft SQL Server 2008,使用以C#和Linq-to-Entities(EF)编写的Web服务,在远程服务器上运行,我们不拥有,但由GoDaddy等服务器公司在'Per Call'上运行/无国籍基础.在SQL Server中设置为默认值的所有内容(例如,Max Pooling = 100,Load Balance Timeout = 0,Pooling = True).我没有进行任何缓存,因为我已经读过缓存不适用于分布式数据库的地方,我认为这是服务器公司使用的.
我很感激.这是伪代码:
Public string MyWebMethod()
{
List<Record> myrecords = new List<Records>();
try //try block 1
{
using (AEntityFramework context = new AEntityFramework())
{
var RecordsReturned = (from x in context.BigTable
//some conditions deleted
select x);
//do some stuff with these records, typically 30 records returned from BigTable, which has 10000 to 100000 records total
foreach (Record r in RecordsReturned)
{ myrecords.Add(r);} //add these records to …Run Code Online (Sandbox Code Playgroud) 我一直在运行着名的旅行商问题的单线程暴力版本,而YourKit正在向我指出CPU最多使用25%的事实.
这个事实背后的原因是什么?我们被告知这些算法是高度CPU密集型的,但在这种情况下似乎有很多浪费的CPU.
我的理论是瓶颈必须是RAM访问.锁定问题似乎是不可能的,因为我运行的算法是单线程的.
我对吗?
我最近写了一个快速而肮脏的BFS实现,在有向图中找到钻石.BFS循环看起来像这样:
while toVisit:
y = toVisit.pop()
if y in visited: return "Found diamond"
visited.add(y)
toVisit.extend(G[y])
Run Code Online (Sandbox Code Playgroud)
(G是图表 - 从节点名称到其邻居列表的字典)
然后是有趣的部分:我认为这list.pop()可能太慢了,所以我运行了一个分析器来比较这个实现的速度和deque.pop - 并得到了一点改进.然后我对它进行了比较y = toVisit[0]; toVisit = toVisit[1:],令我惊讶的是,最后一次实现实际上是最快的.
这有意义吗?是否有任何性能原因可以使用list.pop()而不是显然更快的双线程?
我正在研究一个对对象进行大量操作的程序; 创建,删除,动态展开它们,在指针之间移动,比较内容等.这些对象中的大多数至少是40个字节(最多约90个字节),并且一次可能在内存中有超过10,000个.
我想确定的是我是否应该费心去减小尺寸.我可以分析构造函数,新的,删除等.但是,我认为大型对象最重要的性能来自缓存不友好.有没有办法确定对象大小对发生的缓存未命中数的贡献?
PS:我想过度使用dynamic_cast也会影响性能.然而,这更容易诊断.
编辑:我知道在不进行分析的情况下进行优化是没用的.我要问的是如何从分析中确定是否存在问题.是否有可能在整个代码中分配惩罚,以便标准分析工具不会有用?
一个简单的问题,确实:我有一个内核,它可以运行每个Streaming Multiprocessor(SM)的最大块数,并且想知道我理论上可以从中提取多少性能.理想情况下,我想知道空闲的SM周期的百分比,即所有warp在内存访问时被阻止.
我真的只是想找到这个号码.我不想要的是
在确定各种错误修复的影响的同时,我经常发现自己试图找到通过代码库的所有路由,这些路由最终会出现在我更改的代码中.这是一个繁琐的手动过程,涉及在Eclipse中单击方法名称并搜索"引用...",同时在记事本中绘制调用的树形结构.
这似乎应该是可自动化的,但每当我搜索这样的工具时,我都找不到这样的东西.似乎有工具可以分析代码中的错误,竞争条件等(例如FindBugs,PMD,Checkstyle),但没有任何东西会简单地通过代码输出潜在的路线.我很可能没有使用正确的搜索词.
这样的工具是否存在于Java或者我忽略了为什么这不可能的关键原因?
可能重复:
Java VisualVM在OOME上启用堆转储
我有一个因OOME而崩溃的应用程序.我想在App崩溃之前不久创建堆的转储文件.jdump之前我用过几个小时的运行时来分析堆,但没有发现任何可疑之处.我可以在一些Eclipse分析器中运行该应用程序.在使用普通(或jdk)安装的服务器上抛出OOME之前不久,是否有某种方法可以创建堆转储?
我不是在谈论吸血蜘蛛般的疾病传播者,而是我在这里记录的那种滴答:
Stopwatch noLyme = new Stopwatch();
noLyme.Start();
. . .
noLyme.Stop();
MessageBox.Show(string.Format(
"elapsed milliseconds == {0}, elapsed ticks == {1}",
noLyme.ElapsedMilliseconds, noLyme.ElapsedTicks));
Run Code Online (Sandbox Code Playgroud)
消息框显示的是17357毫秒和56411802滴答; 这相当于每毫秒3250.089416373797个刻度,或每秒约325万个刻度.
由于比率是如此奇怪(3250.089416373797:1),我假设刻度的时间长度根据使用的硬件或其他因素而变化.既然如此,实际使用的是滴答计数?对我来说,似乎毫秒有更多的价值.IOW:为什么我会关心滴答声(可变时间片)?
我使用pdf库将PDF转换为图像.这个过程需要很多时间,我用一个分析器找到问题的原因,并且一切都降低了(> 60%CPU时间)一种方法.现在我的问题是:
这种方法可以进一步改进吗?
public int read(byte[] b) throws IOException {
if (buf==null) throw new IOException("Data buffer not initialized.");
if (pointer<0 || pointer>=length)
return -1;
int length=this.length-(int)pointer;
if(length>b.length)
length=b.length;
for (int i=0; i<length; i++) {
buf.seek(pointer++);
b[i] = buf.readByte();
}
return length;
}
Run Code Online (Sandbox Code Playgroud) 我想检查一段代码所花费的时间.有没有办法做到这一点.我想知道所有的时间,比如(user, system, and elapsed)我的代码的一小部分时间.说我的代码有不同的部分
code 1......
...........
...........
code2.........
...............
...............
所以我想要时间code 1.谢谢