我正在使用Java编写算法实现.在OS X 10.7之前,我使用Shark Profiler来分析我的实现,它的工作非常好.但是,新仪器不再找到程序名称.我已经尝试使用鲨鱼的VM参数运行java应用程序(即-agentlib:Shark),但它们对于10.7是未知的,我找不到这样的工具的agentlib.
有关如何将过程名称附加到Insturments中的符号名称(有些十六进制数字)的任何想法?我正在使用Eclipse Indigo,如果这有任何区别的话.
谢谢!
编辑:到目前为止,OS X Mountain Lion没有任何改变.
编辑#2:来自(?)开发人员的更新通过apple的bug报告者:
dtrace过去一直支持Java堆栈,但老实说我不能说是否支持了这种支持.对于您要测量的内容而言,这可能是一种可行的解决方法 - 此时,这不是性能工具的优先级.您可能希望从/usr/bin/cpu_profiler.d中的D脚本开始并修改它以收集jstack.
编辑#3:好的,经过一些更多的讨论后发现开发人员本身并不知道该脚本的来源.显然,仪器中的时间分析器无论如何都不使用DTrace,因此唯一的选择是编写我们自己的DTrace脚本或仪器.
你是对的,我道歉.我不确定那个脚本来自哪里,当我仔细查看它时,它没有jstack动作,所以它不是你想要的.看起来我能提供的唯一java分析选项是DTrace.DTrace有一个配置文件提供程序,以及一个收集java堆栈的jstack操作.您可以使用"聚合"来确定最重的堆栈跟踪,所有这些都可以从命令行进行.DTrace的文档主要由Sun维护,我会引导您访问任何DTrace教程,因为大多数都涵盖了配置文件提供程序.
尽管人们在网上说,仪器不会将DTrace用于所有内容,特别是时间分析,因此我无法在仪器UI中为您提供快速修复.
当使用Instruments分析我的应用程序(寻找内存泄漏)时,iOS 5 iPhone模拟器的结果与我运行iOS 5的iPhone 4的结果非常不同.第一张图显示了使用真实设备进行分析的结果,第二个是模拟器:
真实设备:

iOS 5模拟器:

在这两种情况下,此配置文件都被应用到应用程序中的同一点:在rootViewController的视图生命周期中完成viewDidLoad.我已经在两个中等待总分配内存稳定输出.正如您在设备图中看到的那样,在00:10左右会出现一些极端波动,这些波动在模拟器中不存在.在真实设备上,总分配内存在00:08左右从1MB跳到3.5 MB然后再回到1.5 MB,最后跳到4.74,稳定下来.为模拟器分配的内存更加线性,它稳定地快速攀升到2.35 MB左右,稳定下来.
需要注意的另一件事是设备上存在2.25 MB的已分配内存,但不是来自malloc的模拟器和来自CFNumber的700+ KB.由于我使用仪器和分析相对较新,我不确定这是否正常.一个快速的谷歌搜索没有任何确定性.2.25 MB和700 KB以上弥补了内存分配的差异.为了平衡事物,有更多的malloc条目,模拟器测试中存在不同的内存量,在设备测试中不存在.
此外,我发现当第二个UIViewController被推送到UINavigationController堆栈时,分配的内存在真实设备上跳转到大约8.5-9 MB,但在模拟器上只有大约4.5到4.5 MB的顶部.
我知道可以预期该设备的运行方式与模拟器有很大不同,但是内存分配不应该非常相似,因为在两个设备上运行相同的代码?我会理解这是否是性能分析,但对于内存分配,似乎数字应该非常相似.任何人都可以了解这是否正常?
我正在使用Allocations模板在iPhone上配置我的应用程序,但VM Tracker始终为空.为什么?如何让它显示数据?

在WWDC 2012 Session 506中,它们UILabel在应用程序中显示每秒的帧数,而无需使用附加到仪器的Core Animation分析器.我想这样做是为了方便以及让我的团队中的其他成员监控FPS,因为他们在真实场景中使用该应用程序.不幸的是,会话506不包括在WWDC '12示例代码中.
有谁知道如何做到这一点?我知道Cocos2D具有这种功能CCDirector,但他们的方法似乎特定于Cocos2D渲染的工作原理.它不必是公共API,因为我不会将此代码发送给客户.
有没有办法比较用Instruments保存的跟踪文件.如何对应用程序的连续实现构建进行任何比较.
以免我说我在2个月内发布iPhone应用程序1.0版1.1.什么是最好的必须在内存和时间方面进行分析比较?
在Xcode and Instruments我看到UILabel (CALayer)使用大量的虚拟内存(匿名VM).我看到每个大约235 KB的虚拟内存UILabel.
我认为这可能是iOS 7.1或7.1.1的新问题.
这是预期的吗?
我创建了一个简单的程序,创建500 UILabels并Instruments显示115MB的内存使用.在大约1500个标签处,应用程序由OS终止.
for (int i = 0; i < 500; i++)
{
index = (int)[self.items count];
index++;
frame = CGRectMake(10.0, 20, 300.0, 50.0);
UILabel *newLabel = [[UILabel alloc] initWithFrame:frame];
newLabel.text = [NSString stringWithFormat:@"This is text for label: %d", index];
newLabel.backgroundColor = [UIColor whiteColor];
[self.view addSubview:newLabel];
[self.items setObject:newLabel forKey:[NSNumber numberWithInteger:index]];
}
Run Code Online (Sandbox Code Playgroud)
思考?
我在我的应用程序中分析关键循环,我在时间分析器设置中看到有趣的选项:
"视为价值观"
当我选择它时,我会看到带有'x'后缀而不是标准百分比值的数字.
作为示例,请参阅附加的屏幕截图(汇编代码视图):
and指令具有442x价值.对于这样简单的汇编指令而言,这个btw似乎很重,并且与循环中的其他指令相比.
这些数字是什么意思?这些是否以某种方式指代给定代码行的CPU周期?
我的应用已启动并正在运行,现在我正在寻求提高渲染性能.使用'仪器'我收集了一些数据.我正在使用旧的iPhone 3G作为最糟糕的情况.
时间分析器:
-30% CopyVertexElementsMultipleSequential
-11% mach_msg_trap
-4% _semwait_signal
-2% ValidateState
Run Code Online (Sandbox Code Playgroud)
但是,使用Open GL ES驱动程序,采样器读取:
-70% _semwait_signal
-24% CopyVertexElementsMultipleSequential
-0.7% mach_msg_trap
Run Code Online (Sandbox Code Playgroud)
浏览文档我无法得出OpenGL ES Sampler和Timer Profiler之间的区别.任何人都可以开导我吗?
我使用Instrument的时间分析器来描述我的代码,并放大到反汇编,这里是结果的片段:
我不希望一条mov指令占23.3%的时间,而div指令几乎什么也没做.这让我相信这些结果是不可靠的.这是真的吗?或者我只是遇到了仪器错误?或者我是否需要使用一些选项来获得可靠的结果?
这个问题是否有任何参考?
instruments ×10
ios ×6
xcode ×4
iphone ×3
profiling ×3
allocation ×1
anonymous ×1
comparison ×1
dtrace ×1
frame-rate ×1
intel-pmu ×1
ios9.1 ×1
java ×1
macos ×1
memory ×1
opengl-es ×1
x86 ×1
xcode7 ×1