1.Linux 性能调优必备:perf 使用指南
2.如何使用perf top探究性能
3.Linux性能优化之CPU使用率
4.ç®å好ç©çç¼ç¨ä»£ç ï¼
Linux 性能调优必备:perf 使用指南
perf 是源码 Linux 内核源码树内嵌的性能剖析工具。
它运用事件采样原理,源码以性能事件为核心,源码支持对处理器和操作系统性能指标的源码剖析。通常用于查找性能瓶颈和定位热点代码。源码
本文目录包括:
安装 perf
在大多数 Linux 发行版中,源码wifi地推源码perf 工具包含在linux-tools 包中。源码使用包管理器安装,源码如 Debian 系统上的源码:
在 Red Hat/CentOS 系统上:
基本使用
列出所有可用的性能事件,包括硬件事件和软件事件。源码
使用perf record 记录目标程序的源码性能数据。
例如:-g 表示记录调用栈,源码-a 表示对所有 CPU 进行采样,源码-F 表示每秒采样 次,源码sleep 6 是源码要分析的程序。
这会生成 perf.data 文件,包含采集的性能数据。
可以指定要分析的事件类型,如 CPU 时钟周期、缓存命中等。yy源码资源
支持跟踪点,一种在内核中预定义的事件,用于跟踪系统调用等。
(常用的)可选参数
每个参数的使用取决于具体需求。例如,使用-a 参数对整个系统进行性能分析;使用-p 或 -t 分析特定进程或线程;-g 对理解程序的函数调用关系非常重要。
实际使用中,先使用perf record ./your_program 进行简单性能记录,再尝试添加不同参数。
分析性能数据
使用perf report 分析记录的数据。
可以用-i 指定要分析的性能数据。
这将展示一个交互式报告,可使用键盘导航查看不同视图。
使用示例
以下是一个简单的 C++ 程序示例,创建一个 std::vector 并使用 push_back 和 emplace_back 方法添加元素,以比较这两种方法在性能上的差异。
ComplexObject 类有一个构造函数,接受一个整数参数并存储它。构造函数和析构函数都会输出一条消息,新闻appandroid源码以便看到对象的创建和销毁。创建 万个这样的对象,并比较 push_back 和 emplace_back 的性能。
要编译和运行这个程序,需要一个支持 C++ 或更高版本的编译器。使用以下命令:
这将编译程序并运行生成的 vector_test 可执行文件。
使用 perf 分析程序性能。
确保有权限运行 perf。
使用以下命令记录性能数据:
perf record ./vector_test
运行结束后,使用perf report 查看性能报告。
在报告中,可以看到不同函数的调用次数、执行时间等信息。
进入交互界面后,
其他功能
perf 提供了许多其他工具,如 perf stat(显示程序运行时的性能统计信息),perf top(实时显示性能热点),perf annotate(显示源代码级别的性能分析)等。
使用perf top 查看实时性能数据。c 试用 源码
对特定函数或代码行进行性能分析。
统计特定事件(如缓存未命中)的发生次数。
高级用法注意事项可能遇到的问题
问题1
根据错误信息,系统上的 perf_event_paranoid 设置为 4,意味着除了具有特定 Linux 能力的进程外,所有用户都无法使用性能监控和可观察性操作。
要解决这个问题,有几个选项:
使用以下命令临时更改设置:
sudo sysctl -w kernel.perf_event_paranoid=-1
或者,如果你只想允许使用用户空间事件:
sudo sysctl -w kernel.perf_event_paranoid=0
请注意,降低 perf_event_paranoid 的值可能会增加系统安全风险。
问题2
错误信息表明,由于 /proc/sys/kernel/kptr_restrict 设置的值,内核符号(kallsyms)和模块的地址映射被限制了。
当你尝试使用perf record 收集性能数据时,如果无法解析内核样本,将无法得到有关内核函数和模块的详细信息。
为了解决这个问题,你可以采取以下步骤:
你可以临时更改 kptr_restrict 的值,以允许 perf 工具访问内核指针。宠物游戏源码
这将设置 kptr_restrict 为 0,允许所有用户访问内核指针。
如果你的系统上有 vmlinux 文件,perf 工具可以使用它来解析内核样本。
确保 vmlinux 文件与当前运行的内核版本相匹配。
如果 vmlinux 文件不存在或过时,你可能需要更新它。
降低 kptr_restrict 的值会降低系统的安全性。
如何使用perf top探究性能
perf top是Linux内核内置的强大性能分析工具,基于事件采样,帮助开发者定位性能瓶颈和热点代码。Linux 2.6版本以后,它几乎涵盖了所有性能相关事件,常见用途是识别占用CPU最多的函数或指令,用于性能问题的诊断。
实战部分,perf top显示内核模块native_write_msr消耗大量CPU,占3.%。结合perf record和report的定时采集,加上-g参数,可以追踪调用链,便于深入分析。例如,我们用Nginx和PHP测试,发现.的请求量下,php-fpm进程的CPU使用率异常,尤其sqrt和add_function函数可能是问题所在。
通过分析源码,发现特定测试代码导致性能下降。移除后,请求量提升至.,证明了性能瓶颈的确在这些函数。总结来说,当遇到CPU使用率升高的情况,先通过top和pidstat等工具定位来源,再利用perf top等工具深入到函数级别进行排查。
perf top是性能诊断的强大助手,帮助我们精细化定位问题。敬请关注下期内容《带着dd去探索Linux磁盘IO》。
Linux性能优化之CPU使用率
CPU 使用率是衡量 CPU 工作负载的指标,通过百分比显示。主要命令用于查看此指标包括 top 和 ps。top 呈现所有 CPU 的平均使用率,输入数字1可查看每个核心的使用率。空白行后显示进程实时信息,每个进程的 %CPU 列表示总使用率,包括用户态和内核态。top 命令不细分。分析单进程使用率时,pidstat 工具适用。使用 pidstat 命令可间隔一秒查看进程的 CPU 使用率。
输出结果包含多个数据点及平均值。top、ps、pidstat 工具有助于定位 CPU 使用率高的进程。但需分析具体原因和代码。perf 工具适合此任务,它基于性能事件采样分析系统事件、内核性能及应用性能。使用 perf 分析 CPU 性能问题有 perf top 和 perf record & perf report 两种方法。perf top 实时显示 CPU 使用率最高的函数或指令,用于查找热点函数。使用界面显示采样数、事件类型和事件总数。采样数过少影响排序和百分比的参考价值。perf top 输出中,第一行包含采样数、事件类型和事件总数。采样数需注意,过少时排序和百分比无实际意义。perf top 输出从第二行开始,包含四列数据,代表不同的含义。perf record 用于保存数据,后续使用 perf report 解析。实际使用中,通常为 perf top 和 perf record 添加 -g 参数以跟踪调用关系。
Linux内核源码分析学习资源:访问 ke.qq.com/course/...
福利加入Linux内核源码分析交流群:点击加入。群内提供了一些个人推荐的优质学习资料,包括书籍和视频,供群成员自由查阅。
案例中,代码执行过程注入死循环,导致CPU使用率达到%。通过工具分析,找到引起CPU利用率升高的代码段。案例代码生成的可执行文件名为 main。在Ubuntu系统中,执行main程序后,使用top命令查看CPU使用率。CPU2的使用率高达%,同时main进程的CPU使用率也达到%,表明系统CPU使用率升高源于main进程。使用perf命令定位具体导致CPU使用率升高的函数。通过调用关系显示,发现问题在于注入死循环的函数func。使用perf工具分析CPU使用率升高原因,支持命令丰富,通过"perf help"查看所有命令,"perf help COMMAND"查看特定命令的用法。
生产工作中,可能遇到系统总体CPU使用率高但单个进程CPU使用率低的情况。分析这类问题时,可使用 pstree 和 execsnoop 工具。下文提供了安装pstree和execsnoop工具的步骤。内容转载自/s/EQdBqN3_sOHQafSUOe1k3g。
ç®å好ç©çç¼ç¨ä»£ç ï¼
ç«é ·çç¼ç¨ä»£ç
ç«é ·çç¼ç¨ä»£ç æ¯@echooffmodeconcols=lines=colorsetlocalenabledelayedexpansionsetcode=abcdefsetm=1setv=1ã
ç¼å®ç¨åºï¼ç®ç§°ç¼ç¨ï¼æ¯æ让计ç®æºä»£ä¸ºè§£å³æ个é®é¢ã对æ个计ç®ä½ç³»è§å®ä¸å®çè¿ç®æ¹å¼ï¼ä½¿è®¡ç®ä½ç³»æç §è¯¥è®¡ç®æ¹å¼è¿è¡ï¼å¹¶æç»å¾å°ç¸åºç»æçè¿ç¨ã
ç¼ç¨å°±æ¯ä¸ºäºåå©äºè®¡ç®æºæ¥è¾¾å°æä¸ç®çæ解å³æ个é®é¢ï¼è使ç¨æç§ç¨åºè®¾è®¡è¯è¨ç¼åç¨åºä»£ç ï¼å¹¶æç»å¾å°ç»æçè¿ç¨ã计ç®æºè½ç¶åè½åå强大ï¼å¯ä»¥ä¸ç½ãç©æ¸¸æã管çå ¬å¸äººäºå ³ç³»ççãä½æ¯æ²¡æç¨åºï¼å®å°±çäºæ¯ä¸å åºéï¼ä¸ä¼çä¼æ们对å®ä¸è¾¾çâå½ä»¤âã
ç¼ç¨è¯è¨ä»ç»
使ç¨æ±ç¼è¯è¨ç¼å计ç®æºç¨åºï¼ç¨åºåä»ç¶éè¦ååçæ计ç®æºç³»ç»ç硬件ç»æï¼æ以ä»ç¨åºè®¾è®¡æ¬èº«ä¸æ¥çä»ç¶æ¯ä½æççãç¦ççãä½æ£æ¯ç±äºæ±ç¼è¯è¨ä¸è®¡ç®æºç¡¬ä»¶ç³»ç»å ³ç³»å¯åï¼å¨æäºç¹å®çåºåï¼å¦å¯¹æ¶ç©ºæçè¦æ±å¾é«çç³»ç»æ ¸å¿ç¨åºä»¥åå®æ¶æ§å¶ç¨åºçï¼è¿ä»ä¸ºæ¢æ±ç¼è¯è¨ä»ç¶æ¯ååææçç¨åºè®¾è®¡å·¥å ·ã
使ç¨é«çº§è¯è¨ç¼åç¨åºçä¼ç¹æ¯ï¼ç¼ç¨ç¸å¯¹ç®åãç´è§ãæç解ãä¸å®¹æåºéãé«çº§è¯è¨æ¯ç¬ç«äºè®¡ç®æºçï¼å èç¨é«çº§è¯è¨ç¼åç计ç®æºç¨åºéç¨æ§å¥½ï¼å ·æè¾å¥½ç移æ¤æ§ã
å¨è®¡ç®æºåºç¨çåæï¼ç¨åºå使ç¨æºå¨çæ令系ç»æ¥ç¼å计ç®æºåºç¨ç¨åºï¼è¿ç§ç¨åºç§°ä¸ºæºå¨è¯è¨ç¨åºã
æ±è¡ç®åCè¯è¨ç¨åºä»£ç ï¼åºç¡ç就好
#includestdio.h
#includestdlib.h
#defineNUM
/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/
//å泡æåºç®æ³
//åºæ¬ææ³ï¼æ¯è¾ç¸é»ç两个æ°ï¼å¦æåè æ¯åè 大ï¼åè¿è¡äº¤æ¢ãæ¯ä¸è½®æåºç»æï¼éåºä¸ä¸ªæªæåºä¸æ大çæ°æ¾å°æ°ç»åé¢ã
voidbubbleSort(int*arr,intn){
inti,j;
for(i=0;in-1;i++)
for(j=0;jn-i-1;j++){
//å¦æåé¢çæ°æ¯åé¢å¤§ï¼è¿è¡äº¤æ¢
if(arr[j]arr[j+1]){
inttemp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//æå·®æ¶é´å¤æ度为O(n^2),å¹³åæ¶é´å¤æ度为O(n^2)ã稳å®æ§ï¼ç¨³å®ãè¾ å©ç©ºé´O(1)ã
//å级çå泡æåºæ³ï¼éè¿ä»ä½å°é«éåºæ大çæ°æ¾å°åé¢ï¼åä»é«å°ä½éåºæå°çæ°æ¾å°åé¢ï¼
//å¦æ¤åå¤ï¼ç´å°å·¦è¾¹çåå³è¾¹çéåãå½æ°ç»ä¸æå·²æåºå¥½çæ°æ¶ï¼è¿ç§æåºæ¯ä¼ ç»å泡æåºæ§è½ç¨å¥½ã
//å级çå泡æåºç®æ³
voidbubbleSort_1(int*arr,intn){
//设置æ°ç»å·¦å³è¾¹ç
intleft=0,right=n-1;
//å½å·¦å³è¾¹çæªéåæ¶ï¼è¿è¡æåº
while(left=right){
inti,j;
//ä»å·¦å°å³éåéåºæ大çæ°æ¾å°æ°ç»å³è¾¹
for(i=left;iright;i++){
if(arr[i]arr[i+1]){
inttemp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
right--;
//ä»å³å°å·¦éåéåºæå°çæ°æ¾å°æ°ç»å·¦è¾¹
for(j=right;jleft;j--){
if(arr[j+1]arr[j]){
inttemp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
left++;
}
}
intmain(intargc,char*argv[]){
intarr[NUM],i,j,temp;
printf("请è¾å ¥ä¸ªæ°ï¼\n");
for(i=0;iNUM;i++){
printf("请è¾å ¥ç¬¬(%d)个æ°ï¼",i+1);
scanf("%d",arr[i]);
}
printf("\nè¾å ¥å¦ä¸æåï¼\n");
for(i=0;iNUM;i++){
printf("%4d",arr[i]);
}/
*for(i=0;iNUM;i++){
for(j=i+1;jNUM;j++){
if(arr[i]arr[j]){
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}*/
bubbleSort_1(arr,NUM);
/*printf("\nä»å°å°å¤§å¦ä¸æåï¼\n");
for(i=0;iNUM;i++){
printf("%4d",arr[i]);
}*/
printf("\nä»å¤§å°å°å¦ä¸æåï¼\n");
for(i=NUM-1;i=0;i--){
printf("%4d",arr[i]);
}
return0;
}
é便ç»æä¸ä¸ªç¼ç¨ä»£ç 带ææ谢谢main()?
{ ?
inti,j,k;?
printf("\n");?
for(i=1;i5;i++)ï¼*以ä¸ä¸ºä¸é循ç¯*/
for(j=1;j5;j++)
for(k=1;k5;k++)
{
if(i!=ki!=jj!=k)/*ç¡®ä¿iãjãkä¸ä½äºä¸ç¸å*/
printf("%d,%d,%d\n",i,j,k);
}?
}
1ã代ç 解éï¼ä»¥ä¸è¿æ®µä»£ç æ¯ç¨Cè¯è¨ååºæ¥ç代ç ï¼ä»æ解å³çé®é¢æ¯ï¼æ1ã2ã3ã4个æ°åï¼è½ç»æå¤å°ä¸ªäºä¸ç¸åä¸æ éå¤æ°åçä¸ä½æ°ï¼é½æ¯å¤å°ï¼?å¯å¡«å¨ç¾ä½ãåä½ã个ä½çæ°åé½æ¯1ã2ã3ã4ãç»æææçæåååå»?æä¸æ»¡è¶³æ¡ä»¶çæåã
2ãCè¯è¨ä»ç»ï¼Cè¯è¨æ¯ä¸é¨éç¨è®¡ç®æºç¼ç¨è¯è¨ï¼åºç¨å¹¿æ³ãCè¯è¨ç设计ç®æ æ¯æä¾ä¸ç§è½ä»¥ç®æçæ¹å¼ç¼è¯ãå¤çä½çº§åå¨å¨ã产çå°éçæºå¨ç 以åä¸éè¦ä»»ä½è¿è¡ç¯å¢æ¯æ便è½è¿è¡çç¼ç¨è¯è¨ã
3ãCè¯è¨çä¼ç¹ï¼ç®æ´ç´§åãçµæ´»æ¹ä¾¿ãè¿ç®ç¬¦ä¸°å¯ãæ°æ®ç»æ丰å¯ãCæ¯ç»æå¼è¯è¨ãCè¯æ³éå¶ä¸å¤ªä¸¥æ ¼ãç¨åºè®¾è®¡èªç±åº¦å¤§ï¼ä¸è¬çé«çº§è¯è¨è¯æ³æ£æ¥æ¯è¾ä¸¥ï¼è½å¤æ£æ¥åºå ä¹ææçè¯æ³é误ãèCè¯è¨å 许ç¨åºç¼åè æè¾å¤§çèªç±åº¦ãCè¯è¨ç¨åºçæ代ç è´¨éé«ï¼ç¨åºæ§è¡æçé«ï¼ä¸è¬åªæ¯æ±ç¼ç¨åºçæçç®æ 代ç æçä½ã¸%ã
4ãå ¶ä»ç¼ç¨è¯è¨ä»ç»ï¼Python(è±å½åé³:/?pa?θ?n/ç¾å½åé³:/?pa?θÉ?n/),æ¯ä¸ç§é¢å对象ç解éå计ç®æºç¨åºè®¾è®¡è¯è¨ï¼ç±è·å °äººGuidovanRossumäºå¹´åæï¼ç¬¬ä¸ä¸ªå ¬å¼åè¡çåè¡äºå¹´ãPythonæ¯çº¯ç²¹çèªç±è½¯ä»¶ï¼?æºä»£ç å解éå¨CPythonéµå¾ªGPL(GNU?GeneralPublicLicense)åè®®ãPythonè¯æ³ç®æ´æ¸ æ°ï¼ç¹è²ä¹ä¸æ¯å¼ºå¶ç¨ç©ºç½ç¬¦(whitespace)ä½ä¸ºè¯å¥ç¼©è¿ã
pythonæ趣çç¼ç¨ä»£ç class?Point:
row=0col=0def?__init__(self,?row,?col):self.row=row
self.col=col
def?copy(self):return?Point(row=self.row,?col=self.col)
#åå§æ¡æ¶
import?pygame
import?random
#åå§å
pygame.init()
W=
H=
ROW=
COL=
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('è´ªåè')
bg_color=(,,)
snake_color=(,,)
head=Point(row=int(ROW/2),?col=int(COL/2))
head_color=(0,,)
snakes=[
Point(row=head.row,?col=head.col+1),Point(row=head.row,?col=head.col+2),Point(row=head.row,?col=head.col+3)]
#çæé£ç©
def?gen_food():
while?1:pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))
#
is_coll=False
#æ¯å¦è·è碰ä¸äº
if?head.row==pos.row?and?head.col==pos.col:
is_coll=True#è身å
for?snake?in?snakes:
if?snake.row==pos.row?and?snake.col==pos.col:is_coll=True
break
if?not?is_coll:
breakreturn?pos#å®ä¹åæ
food=gen_food()
food_color=(,,0)
direct='left'#left,right,up,down
#
def?rect(point,?color):
cell_width=W/COLcell_height=H/ROWleft=point.col*cell_widthtop=point.row*cell_heightpygame.draw.rect(window,?color,
(left,?top,?cell_width,?cell_height)
)pass#游æ循ç¯
quit=True
clock=pygame.time.Clock()
while?quit:
#å¤çäºä»¶for?event?in?pygame.event.get():if?event.type==pygame.QUIT:
quit=Falseelif?event.type==pygame.KEYDOWN:
if?event.key==?or?event.key==:if?direct=='left'?or?direct=='right':
direct='up'elif?event.key==?or?event.key==:if?direct?==?'left'?or?direct?==?'right':
direct='down'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='left'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='right'#åä¸è¥¿eat=(head.row==food.row?and?head.col==food.col)#éæ°äº§çé£ç©if?eat:food?=?gen_food()
#å¤ç身å#1.æåæ¥ç头ï¼æå ¥å°snakesç头ä¸snakes.insert(0,?head.copy())#2.æsnakesçæåä¸ä¸ªå æif?not?eat:snakes.pop()
#移å¨if?direct=='left':head.col-=1
elif?direct=='right':head.col+=1
elif?direct=='up':head.row-=1
elif?direct=='down':head.row+=1
#æ£æµdead=False#1.æå¢if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:dead=True
#2.æèªå·±for?snake?in?snakes:if?head.col==snake.col?and?head.row==snake.row:
dead=Truebreakif?dead:print('æ»äº')
quit=False
#渲æââç»åºæ¥#èæ¯pygame.draw.rect(window,?bg_color,?(0,0,W,H))#è头for?snake?in?snakes:rect(snake,?snake_color)
rect(head,?head_color)rect(food,?food_color)#pygame.display.flip()#设置帧é¢ï¼é度ï¼clock.tick(8)#æ¶å°¾å·¥ä½
è¿æ¯ä¸ä¸ªç®æçè´ªåèç代ç ï¼è½ç¶ç»æç®åï¼ä½æ¯è¯¥æçåè½é½æ¯å®æ´çï¼å¯ç©æ§ä¹ä¸é
cè¯è¨ç¼ç¨çè±ä»£ç ç®åcè¯è¨ç¼ç¨çè±ä»£ç ç®åå¦ä¸ï¼
#include"stdlib.h"
#include"graphics.h"
#include"stdio.h"
#include"math.h"
#include"conio.h"
#definePI?3.
main()
{
intgdriver=DETECT,gmode,errorcode;
inta[],b[],x,y,c,r,i,j,t;
doublerad=0.0;
/*initializegraphicsandlocalvariables*/
initgraph(gdriver,gmode,"");
/*readresultofinitialization*/
errorcode=graphresult();
if(errorcode!=grOk)?/*anerroroccurred*/
{
printf("Graphicserror:%s/n",grapherrormsg(errorcode));
printf("Pleaseanykeytohalt:");
getch();
exit(1);?/*terminatewithanerrorcode*/
}
randomize();
for(;!kbhit();)
{
x=rand()%+;/*éæºä¸å¿åæ */
y=rand()%+;
for(r=0;r=8;r++?)?/*çè±ç大å°è®¾å®*/
{
for(i=0,rad=0.0;rad2*PI;rad+=0.)?/*设å®åæ */
{
a[i++]=x+(int)r**cos(rad);
b[i]=y+(int)r**sin(rad);
}
t=i;
for(i=1;it;i++)
{
c=rand()%+1;/*åç¹çé¢è²éæº*/
setcolor(c);/*åè½:å°å½åå¾å½¢å±å¹çå½åç¬ç»é¢è²ç½®ä¸ºcolor.*/
circle(a[i],b[i],1);/*a[i],b[i]为åå¿1为åå¾ç»å*/
}
delay();
delay();
cleardevice();
å½æ°å:cleardevice?
å?è½:æ¸ é¤å¾å½¢å±å¹?
ç¨?æ³:voidfarcleardevice(void);
}
}
getch();
closegraph();
å½æ°å:closegraph
å?è½:å ³éå¾å½¢ç³»ç»
ç¨?æ³:voidfarclosegraph(void);
}
åå§åçè±åæ°
voidInit(inti)
{
//åå«ä¸ºï¼çè±ä¸å¿å°å¾çè¾¹ç¼çæè¿è·ç¦»ãçè±ä¸å¿å°å¾çå·¦ä¸è§çè·ç¦»(xãy)两个åé
intr[]={ ,,,,,,,,,,,,};
intx[]={ ,,,,,,,,,,,,};
inty[]={ ,,,,,,,,,,,,};
/****åå§åçè±*****/
Fire[i].x=0;//çè±ä¸å¿åæ
Fire[i].y=0;
Fire[i].width=;//å¾ç宽
Fire[i].height=;//å¾çé«
Fire[i].max_r=r[i];//æ大åå¾
Fire[i].cen_x=x[i];//ä¸å¿è·å·¦ä¸è§è·ç¦»
Fire[i].cen_y=y[i];
Fire[i].show=false;//æ¯å¦ç»½æ¾
Fire[i].dt=5;//绽æ¾æ¶é´é´é
Fire[i].t1=timeGetTime();
Fire[i].r=0;//ä»0å¼å§ç»½æ¾
/****åå§åçè±å¼¹*****/
Jet[i].x=-;//çè±å¼¹å·¦ä¸è§åæ
Jet[i].y=-;
Jet[i].hx=-;//çè±å¼¹åå°æé«ç¹åæ
Jet[i].hy=-;
Jet[i].height=0;//åå°é«åº¦
Jet[i].t1=timeGetTime();
Jet[i].dt=rand()%;//åå°é度æ¶é´é´é
Jet[i].n=0;//çè±å¼¹éªçå¾çä¸æ
Jet[i].shoot=false;//æ¯å¦åå°
}
2024-12-28 20:31624人浏览
2024-12-28 20:15241人浏览
2024-12-28 19:461230人浏览
2024-12-28 19:381893人浏览
2024-12-28 19:35515人浏览
2024-12-28 19:161562人浏览
中国消费者报福州讯记者张文章)今年以来,福建省莆田市市场监管局持续开展2023年民生领域案件查办“铁拳”行动,重点关注网络餐饮食品安全整治,不断强化对第三方平台和入网餐饮服务提供者落实食品安全主体责任
文:藤AYA從「憧憬感」、「親切感」、「支持感」的角度來做品牌行銷了解「自己能開發哪些事業」之後,就要進入思考「如何向大眾宣傳」的階段。「怎麼行銷自己更容易吸引忠實粉絲呢?」—這個訣竅大致可分為兩種,
烏克蘭總統澤連斯基。(法新社資料圖片) 據央視新聞報道,當地時間6月25日,烏克蘭總統澤連斯基簽署法令,批准烏國家安全與國防委員會有關在烏武裝部隊組建無人系統部隊作為單獨軍種的決定,該法令已在烏總統