我正在调试一个运行速度相当慢的应用程序,当构建为64位Linux ELF可执行文件而不是32位Linux ELF可执行文件时.使用Rational(IBM)Quantify,我跟踪了很多性能差异(鼓声......)memset.奇怪的是,memset正在采取很多在64位可执行更长的时间.
我甚至可以通过一个简单的小应用程序看到这个:
#include <stdlib.h>
#include <string.h>
#define BUFFER_LENGTH 8000000
int main()
{
unsigned char* buffer = malloc(BUFFER_LENGTH * sizeof(unsigned char));
for(int i = 0; i < 10000; i++)
memset(buffer, 0, BUFFER_LENGTH * sizeof(unsigned char));
}
Run Code Online (Sandbox Code Playgroud)
我这样建造:
$ gcc -m32 -std=gnu99 -g -O3 ms.c
和
$ gcc -m64 -std=gnu99 -g -O3 ms.c
所报告的挂钟时间time对于-m64构建而言更长,而Quantify确认了额外的时间用于memset.
到目前为止,我已经在VirtualBox和VMWare中进行了测试(但不是裸机Linux;我意识到我需要在下一步做到这一点).从一个系统到另一个系统,花费的额外时间似乎有所不同.
这里发生了什么?是否存在我的Google-foo无法发现的众所周知的问题?
编辑:gcc ... -S我的系统上的反汇编()显示memset正在作为外部函数调用:
32位:
.LBB2:
.loc 1 14 …Run Code Online (Sandbox Code Playgroud) 有哪些工具可用于查看内置JVM分析器的输出?例如,我正在启动我的JVM:
-agentlib:hprof=cpu=times,thread=y,cutoff=0,format=a,file=someFile.hprof.txt
Run Code Online (Sandbox Code Playgroud)
这将以hprof("JAVA PROFILE 1.0.1")格式生成输出.
过去,我已经成功使用HPjmeter以合理的方式查看这些输出文件.但是,无论出于何种原因,使用当前版本的Sun JVM生成的文件都无法加载到当前版本的HPjmeter中:
java.lang.NullPointerException
at com.hp.jmeter.f.jb.a(Unknown Source)
at com.hp.jmeter.f.a.a(Unknown Source)
at com.hp.c.a.j.z.run(Unknown Source)
Exception in thread "HPeprofDataFileReaderThread" java.lang.AssertionError: null pointer exception from loader
at com.hp.jmeter.f.a.a(Unknown Source)
at com.hp.c.a.j.z.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
(为什么他们会混淆免费产品的字节码?!)
由此产生两个问题:
我知道Eclipse TPTP和其他工具可以动态监视JVMTI数据,但我需要一个可以处理生成的hprof文件的解决方案,因为部署的机器只安装了JRE(而不是JDK).
编辑:一个非常有用的HPjmeter开发人员在HP ITRC论坛上回复了我的问题,表明heap=dump需要-agentlib暂时包含在选项中,直到HPjmeter中的错误得到修复.这些信息使HPjmeter再次可行,但我仍然会问这个问题是否有人知道任何其他工具.
编辑:从HPjmeter 4.0.00版(2009年5月可用)开始修复此错误.
着名的JDK文档说:java.lang.String.hashCode()
String对象的哈希码计算为
Run Code Online (Sandbox Code Playgroud)s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]using
intarithmetic,其中s[i]是i字符串的**th字符,是字符串n的长度,^表示取幂.
该表达式的标准实现是:
int hash = 0;
for (int i = 0; i < length; i++)
{
hash = 31*hash + value[i];
}
return hash;
Run Code Online (Sandbox Code Playgroud)
看着这个让我觉得我正在通过算法课程沉睡.这个数学表达式如何转化为上面的代码?
我正在创建一个ToolTip窗口,并使用标志TTF_IDISHWND |为其添加工具 TTF_SUBCLASS.(c ++,win32)
我有一个清单文件,以便我的程序使用新的WindowsXP主题(comctrl32版本6).
当我将鼠标悬停在已注册的工具上时,会出现提示.
好.
当我单击鼠标时,提示消失.
好.
但是,远离工具并再次返回不会使尖端重新出现.我需要将鼠标悬停在不同的工具上,然后返回我的工具以获取提示返回.
当我删除我的清单文件(使用较旧的非XP comctrl32)时,问题就消失了.
在做了一些实验之后,我发现Comctl32版本5(旧版)和Comctl32版本6(新版)中的工具提示之间存在以下差异:
如果鼠标按钮关闭,则新的TTF_TRANSPARENT工具提示(当就地使用时)实际上从WM_NCITTEST返回HTCLIENT,从而获得WM_LBUTTONDOWN并在消失之前暂时关注焦点.这会导致应用程序的边框闪烁.
旧的TTF_TRANSPARENT工具提示始终从WM_NCHITTEST返回HTTRANSPARENT,因此永远不会自己获取WM_LBUTTONDOWN并且永远不会窃取焦点.(这似乎只是审美,但可能影响下一点...)
新工具提示似乎在鼠标单击后不会获得WM_TIMER事件,并且仅在取消激活并重新激活后才恢复获取(一堆)计时器事件.因此,在鼠标单击和释放后,它们不会重新显示其提示窗口.
只需在单击/释放后再次移动鼠标,旧工具提示就会收到WM_TIMER消息,因此他们可以重新显示他们的提示.
因此,作为一个comctl32解决方法,我不得不:
子类TOOLTIPS_CLASS窗口,如果工具要求透明,则始终从WM_NCHITTEST返回HTTRANSPARENT.
避免使用TTF_SUBCLASS而是自己处理鼠标消息,这样我就可以在收到WM_xBUTTONUP时取消激活/重新激活.
我假设内部行为的变化是为了适应工具提示中的新"可点击"功能,如超链接,但悬停行为似乎因此被打破.
有没有人知道比我的子类解决方案更好的解决方案?我错过了其他一些观点吗?
使用自定义绘制(NM_CUSTOMDRAW)绘制ListView子项的全部内容(在"报表/详细信息"视图中)时,能够在我的自定义绘制方法中应用相同的左右填充,这将是很好的.控制自己的非自定义绘制项目.
有没有办法以编程方式检索此填充值?它是否与特定字符的宽度(""或"w"或其他东西?)有关,还是固定值(左边是6px,右边是3px还是......)或者......?
编辑:为了澄清,我想添加相同的填充到我的NM_CUSTOMDRAWn子项,控件添加到它绘制的项目,并且我正在寻找的度量,例如,第二列的开头之间的空白以下屏幕截图中的"Siamese"一词(注意:MSDN的屏幕截图已添加,以帮助解释我的问题):
.png)
请注意,单词"Siamese"与标题项("Breed")对齐.我希望能够保证自定义绘制项目的对齐方式.
看起来获得Java虚拟机规范的Java 6版本的唯一方法是采用第二版,在现有变更中合并然后添加Java 6提出的更改,这些更改不再是真正提出的了,但实际.
真?
出现两个问题:
任何人都知道我错过了什么,到底是什么?
在Mozilla基金会继续新的语言功能添加到JavaScript的.它们现在达到1.8版本,其中1.5或多或少是ECMA基线.
但是,Firefox是唯一支持最新版本的浏览器,IE坚持使用1.5等效的JScript.
Firefox专用扩展的目的是什么?或者他们只是处于休眠状态,直到(以及如果)其他浏览器赶上?
当应用程序位于其他应用程序后面并且我单击我的应用程序的任务栏图标时,即使打开了app-modal,WS_POPUP对话框,我也希望整个应用程序位于z-order的顶部.
但是,有些时候,对于我的一些(和其他人)对话框,只有对话框出现在前面; 应用程序的其余部分留在后面.
我看过Spy ++,对于那些工作正常的,我可以看到WM_WINDOWPOSCHANGING被发送到对话框的父级.对于留下应用程序其余部分的那些,WM_WINDOWPOSCHANGING不会被发送到对话框的父级.
我有一个例子,其中一个对话框通常带有整个应用程序,而另一个没有.工作对话框和非工作对话框都具有相同的窗口样式,子样式,父级,所有者,个体发生.
简而言之,两者都是使用DialogBoxParam()创建的WS_POPUPWINDOW窗口,它们传入了与第三个参数相同的HWND.
有没有人注意到Windows程序中的这种行为奇怪?单击按钮时,TaskBar会向应用程序发送什么消息?谁负责确保所有应用程序的窗口都出现在前台?
在我的情况下,基础父母是一个MDI框架...以某种方式影响这个因素?
我有一个全局定义的符号,需要对我的源文件的给定子集有条件地定义.所有需要特殊处理的文件都已包含在包含前后的内容中:
pre.h:
#undefine mysymbol // [1]
Run Code Online (Sandbox Code Playgroud)
post.h:
#define mysymbol MY_SYMBOL_DEFINITION // [2]
Run Code Online (Sandbox Code Playgroud)
我的问题是,pre.h和post.h可以包括对于给定的源文件多次因各种包含链接.因此,我需要1到发生第一次pre.h包括在内,我需要2发生的最后一次是post.h被包括在内.概念:
pre // undefine
pre // no-op
pre // no-op
post // no-op
post // no-op
post // redefine
Run Code Online (Sandbox Code Playgroud)
由于我使用的是GCC 3.4.6,因此我无法访问可能为我解决此问题的push和pop宏pragma.
如何使用剩余的预处理器功能模拟该行为?
我试图用预处理器来增加/减少一个值,但我不确定这是可能的.
"我到底想要做什么?"
我们有宏替换new用new(__FILE__, __LINE__)-看到关于这个主题我的其他问题 -我们需要取消定义这些宏在被包裹组源文件的前置和后置包括上述,因为我们无法创建一个宏,是与其中使用的放置新语法兼容.
确定给定的ksh调用是否正在运行交互式shell的首选方法是什么?
我在一个ENV文件中有一些命令,我想跳过非交互式ksh调用(例如,在执行shell脚本时).
我见过建议范围从:
if [[ $- = *i* ]]; then
# do interactive stuff
fi
Run Code Online (Sandbox Code Playgroud)
... .kshrc除非使用这个神秘的咒语确定壳是交互式的,否则甚至不采购:
ENVIRON=$HOME/.kshrc export ENVIRON
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}' export ENV
Run Code Online (Sandbox Code Playgroud) 鉴于以下内容:
有没有办法在每个编译单元中包含一个定义(例如宏)而不修改每个源文件以包含新的头文件?
我有一些编写C代码的古老记忆:
long value = 0;
Run Code Online (Sandbox Code Playgroud)
在糟糕的旧Win16天,最后value只有半初始化:即低16位0,高16位是内存中该位置的随机位.因此,我有条件写:
long value = 0L;
Run Code Online (Sandbox Code Playgroud)
在C99和/或C++这个时代仍然需要这个吗?我知道ILP32指定int并且long都是32位,但是假设我们正在使用LP64,其中ints是32位,longs是64位.是否需要后缀或现代形式的C和C++是否会将文字隐式地扩展到它们被赋给的变量的长度?
无符号值怎么样?即这是必需的吗?
unsigned long value = 0UL;
Run Code Online (Sandbox Code Playgroud) 我正在使用Win32 MultiMedia函数PlaySound从我的应用程序播放声音.
我希望能够在不修改系统音量的情况下动态调整正在播放的声音音量.
我可以找到的唯一建议来操作通过PlaySound播放的声音音量是使用waveOutSetVolume,但是该功能设置系统范围的音量级别(不是我想要的).