最近、iOS の携帯電話のパフォーマンス データ (主にメモリ) を取得する方法を研究しているのですが、調べてみたところ、主に 2 つの方法が主流です: 1. Ali のオープンソース iOS 自動テスト ツール Tidevice、2. xcode に付属するインストゥルメント、2. xcode に付属するインストゥルメント。
1. モバイル端末の性能指標
1.CPU
通常は20~40%程度で、80%以上になると注意が必要です。
2. 記憶
rss: プライベート メモリ + すべての共有メモリ、pss: プライベート メモリ + 共有メモリの比例割り当て、一般に vss>=rss>=pss>=uss;
ページを抜けた後にメモリが減少していないか、特定の操作を実行した後にメモリが急激に増加していないかなどに注意する必要があります。
3.fps
30 ~ 60 の間が妥当で、30 より低いと明らかな遅延が発生し、70 より高いと認識されず、グラフィック プロセッサの容量を無駄に消費します。
4. 消費電力
試験前に規定時間内の通常待機時(再起動後の待機時)における携帯電話の消費電力を確認してください。次に、テスト対象のアプリを起動して、消費電力がどのくらい増加したかを確認し、その差を取得します。
5.クラッシュ
<0.03% は優れていることを意味し、<0.1% は良好を意味します。
6. 起動時間
7. 交通
8.GPUのオーバーレンダリング
二、tidevice
タイドバイスは Ali によるオープンソースの iOS 自動テスト ツールで、スクリーンショットの提供、携帯電話情報の取得、ipa パッケージのインストールとアンインストール、バンドル ID に基づくアプリケーションの開始と停止、指定されたアプリケーションのパフォーマンス データの取得、xctest やその他の機能を実行するための Xcode のシミュレートが可能です。メイン alibaba/taabao-iphone-device GitHubにある taovao-iphone-device/README.md
タイドバイスをインストールする
pip3 install -U "tidevice[openssl]"
タイドヴァイスはコマンドラインまたはPythonスクリプトを使用してパフォーマンスデータを取得できます。
1. コマンドラインモード:
tidevice applist
ipaファイルのバンドルIDを取得する
パフォーマンスデータを表示する
tidevice perf -B bundleID
出力データ形式は以下の通りで、取得時刻はタイムスタンプ形式となります。
fps {'fps': 46, 'value': 46, 'timestamp': 1655023837471}
gpu {'device': 22, 'renderer': 20, 'tiler': 22, 'value': 22, 'timestamp': 1655023837572}
cpu {'timestamp': 1655023837647, 'pid': 2734, 'value': 0.6984475878545683, 'sys_value': 83.33333333333331, 'count': 2}
memory {'pid': 979, 'timestamp': 1655023837647, 'value': 148.61046600341797}
network {'timestamp': 1655023837613, 'downFlow': 78.1064453125, 'upFlow': 0.7294921875}
2.Pythonスクリプトモード
import time
import tidevice
from tidevice._perf import DataType
t = tidevice.Device()
# perf = tidevice.Performance(t,[DataType.CPU, DataType.MEMORY, DataType.NETWORK, DataType.FPS, DataType.PAGE, DataType.SCREENSHOT, DataType.GPU])
perf = tidevice.Performance(t,DataType.MEMORY)
def callback(_type:tidevice.DataType,value:dict):
print(_type.value,value)
perf.start('com.meituan.imerchantbiz.ep',callback = callback)
time.sleep(60)
perf.stop()
リアルタイムのパフォーマンス収集レポートは、pyecharts を使用して自動的に生成できます。
パイチャートをインストールする
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pyecharts
#绘图
x = [i for i in range(len(d))]
y = d
print(x)
print(y)
#创建对象,可以添加一些参数
line = Line(init_opts=options.InitOpts(width='800px',height='600px'))
#添加x轴y轴数据,注意添加y轴数据的时候必须设置series_name参数,表示图例的名称
line.add_xaxis(xaxis_data=x)
line.add_yaxis(series_name='memory', y_axis=y, is_symbol_show=True, label_opts=options.LabelOpts(is_show=False),
#is_symbol_show=True显示点,label_opts=opts.LabelOpts(is_show=False)不显示值
#设置展示最大值最小值
markpoint_opts=options.MarkPointOpts(
data=[
options.MarkPointItem(type_="max",name="最大值", symbol="pin", symbol_size=[70,50]),
options.MarkPointItem(type_="min", name="最小值",symbol="pin", symbol_size=[70,50], itemstyle_opts={'color':'#3CB371'}),
]
),
#设置展示平均值
markline_opts=options.MarkLineOpts(
data=[options.MarkLineItem(type_="average",name="平均值")]
))
line.render()
os.system('open render.html')
効果例:最大値、最小値、平均値が表示され、マウスをある点に移動すると、その点の値が表示されます。
3. 発生した問題
(1) エラーが発生します。tideevice.Exceptions.MuxError: ImageMountFailed
解決策: デバイスがサポートされていないことが原因である可能性があります。対応するバージョンの開発者をダウンロードし、xcode で wda を再インストールしてください。
(2) エラーが発生します: sh: ./render.html: 許可が拒否されました
解決策: これは、プログラム chmod 755 render.html に読み取りおよび書き込み権限が割り当てられていないためです。
(3)报错:./render.html: 1行目: 予期しないトークン「newline」付近の構文エラー
まだ解決されていません。まず、render.html を開くように変更します。
3、xcode-instruments
1. メモリのデータリークを取得する
xcode-open 開発者ツール-打楽器;
開いた漏れ。
テスト対象のデバイスとテスト対象のアプリケーションを選択し、 「開始」をクリックするとプロジェクトが実行され、観察できるようになります。
赤い x が表示される場合は、メモリ リークがあることを意味します。
赤い x を選択し、リーク コール ツリーを見つけ、一番下のコール ツリーを見つけ、呼び出しツリーの反転を選択し、システム ライブラリを選択すると、クラスとリークされたメソッドが表示されます。ダブルクリックして詳細を表示し、変更を開始します。
Invert Call Treeは、コール ツリーを反転することを意味します。これは、関数を呼び出すとき、レイヤーごとに行われることを意味します。外側の関数を呼び出すと、最後のレイヤーまで常に内側のレイヤーに入りますが、これは少し再帰的です。Invert Call Tree オプションが選択されている場合、内側の関数が直接表示されるため、見つけるのに便利です。逆出力コールツリー。最も深い呼び出しレベルのメソッドを一番上に表示すると、最も時間のかかる操作を見つけやすくなります。
システム ライブラリを非表示にする: システム ライブラリ ファイルを非表示にします。さまざまなシステム コールをフィルタリングして除外し、独自のコード コールのみを表示します。
出现报错:計測器は、ターゲット アプリケーションのプロファイリングに必要な権限を取得できませんでした。