profile_profiler - CSDN
profile 订阅
Profile
信息
操作系统
未知
开发语言
开源协议
未知
Profile
Profiles calls to jQuery(selector) , so that you can see which calls to jQuery are taking time. This plugin is meant to complement tools such as the Firebug profiler, which profile all the function calls in your script, but don't (at present) allow you to drill down into the different arguments to a single call. Call $.profile.start() to start profiling calls to $(selector) , and then $.profile.done() to stop profiling and print out something like this: Selector                 Count  Total  Avg+/-stddev script, script, scri...  100    101ms  1.01ms+/-1.01 script                   200     58ms  0.29ms+/-0.53 html body #output        100     55ms  0.55ms+/-0.74 script, #output          100     54ms  0.54ms+/-0.73 #output                  100      6ms  0.06ms+/-0.24 You can also include the ?jquery.profile.start query parameter in your page URL to begin profiling automatically as soon as the plugin is loaded.
收起全文
精华内容
参与话题
  • profile介绍

    2017-03-28 11:41:41
    profile介绍 4.1 profile简介 profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置...

    4       profile介绍

    4.1     profile简介

    profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,我们可以通过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5以下使用另外一套配置信息;或者有时候我们可以通过操作系统的不同来使用不同的配置信息,比如windows下是一套信息,linux下又是另外一套信息,等等。具体的激活条件有哪些我在后文会讲到。

    4.2     profile的定义位置

    对于使用Maven3,我们可以有多个地方定义profile。定义的地方不同,它的作用范围也不同。

    (1)    针对于特定项目的profile配置我们可以定义在该项目的pom.xml中。

    (2)    针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户家目录下的“.m2”目录下。

    (3)    全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件中的。

    4.3     profile中能定义的信息

    profile中能够定义的配置信息跟profile所处的位置是相关的。以下就分两种情况来讨论,一种是定义在settings.xml中,另一种是定义在pom.xml中。

    4.3.1  profile定义在settings.xml中

    当profile定义在settings.xml中时意味着该profile是全局的,它会对所有项目或者某一用户的所有项目都产生作用。因为它是全局的,所以在settings.xml中只能定义一些相对而言范围宽泛一点的配置信息,比如远程仓库等。而一些比较细致一点的需要根据项目的不同来定义的就需要定义在项目的pom.xml中。具体而言,能够定义在settings.xml中的信息有<repositories>、<pluginRepositories>和<properties>。定义在<properties>里面的键值对可以在pom.xml中使用。

    4.3.2  profile定义在pom.xml中

    定义在pom.xml中的profile可以定义更多的信息。主要有以下这些:

    l  <repositories>

    l  <pluginRepositories>

    l  <dependencies>

    l  <plugins>

    l  <properties>

    l  <dependencyManagement>

    l  <distributionManagement>

    l  还有build元素下面的子元素,主要包括:

    <defaultGoal>

    <resources>

    <testResources>

    <finalName>

    4.4     profile的激活方式

    Maven给我们提供了多种不同的profile激活方式。比如我们可以使用-P参数显示的激活一个profile,也可以根据环境条件的设置让它自动激活等。下面将对它们一一进行介绍:

    4.4.1  使用activeByDefault设置激活

    先看下面一个配置

    Xml代码  收藏代码
    1. <profiles>  
    2.         <profile>  
    3.              <id>profileTest1</id>  
    4.              <properties>  
    5.                     <hello>world</hello>  
    6.              </properties>  
    7.              <activation>  
    8.                     <activeByDefault>true</activeByDefault>  
    9.              </activation>  
    10.         </profile>  
    11.           
    12.         <profile>  
    13.              <id>profileTest2</id>  
    14.              <properties>  
    15.                     <hello>andy</hello>  
    16.              </properties>  
    17.         </profile>  
    18.  </profiles>  

     

            我们可以在profile中的activation元素中指定激活条件,当没有指定条件,然后指定activeByDefault为true的时候就表示当没有指定其他profile为激活状态时,该profile就默认会被激活。所以当我们调用mvn package的时候上面的profileTest1将会被激活,但是当我们使用mvn package –P profileTest2的时候将激活profileTest2,而这个时候profileTest1将不会被激活。

    4.4.2  在settings.xml中使用activeProfiles指定处于激活状态的profile

    我们可以在settings.xml中使用activeProfiles来指定需要激活的profile,这种方式激活的profile将所有情况下都处于激活状态。比如现在我们定义了如下两个profile

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <properties>  
    5.                    <hello>world</hello>  
    6.             </properties>  
    7.        </profile>  
    8.          
    9.        <profile>  
    10.             <id>profileTest2</id>  
    11.             <properties>  
    12.                    <hello>andy</hello>  
    13.             </properties>  
    14.        </profile>  
    15. </profiles>  

     

           这里的profile可以是定义在settings.xml中的,也可以是定义在pom.xml中的。这个时候如果我们需要指定profileTest1为激活状态,那么我们就可以在settings.xml中定义activeProfiles,具体定义如下:

    Xml代码  收藏代码
    1. <activeProfiles>  
    2.      <activeProfile>profileTest1</activeProfile>  
    3. </activeProfiles>  

     

           考虑这样一种情况,我们在activeProfiles下同时定义了多个需要激活的profile。这里还拿上面的profile定义来举例,我们定义了同时激活profileTest1和profileTest2。

    Xml代码  收藏代码
    1. <activeProfiles>  
    2.      <activeProfile>profileTest1</activeProfile>  
    3.      <activeProfile>profileTest2</activeProfile>  
    4. </activeProfiles>  

     

           从profileTest1和profileTest2我们可以看出它们共同定义了属性hello。那么这个时候我在pom.xml中使用属性hello的时候,它到底取的哪个值呢?是根据activeProfile定义的顺序,后面的覆盖前面的吗?根据我的测试,答案是非也,它是根据profile定义的先后顺序来进行覆盖取值的,然后后面定义的会覆盖前面定义的。

    4.4.3  使用-P参数显示的激活一个profile

    假设我们现在有如下定义的profiles

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.               <id>profileTest1</id>  
    4.               <properties>  
    5.                      <hello>world</hello>  
    6.               </properties>  
    7.        </profile>  
    8.        <profile>  
    9.               <id>profileTest2</id>  
    10.               <properties>  
    11.                      <hello>andy</hello>  
    12.               </properties>  
    13.        </profile>  
    14. <profiles>  

     

           那么当我们在进行Maven操作时就可以使用-P参数显示的指定当前激活的是哪一个profile了。比如我们需要在对项目进行打包的时候使用id为profileTest1的profile,我们就可以这样做:

    Cmd代码  收藏代码
    1. mvn package –P profileTest1  

     

           当我们使用activeByDefault或settings.xml中定义了处于激活的profile,但是当我们在进行某些操作的时候又不想它处于激活状态,这个时候我们可以这样做:

    Cmd代码  收藏代码
    1. Mvn package –P !profileTest1  

     

           这里假设profileTest1是在settings.xml中使用activeProfile标记的处于激活状态的profile,那么当我们使用“-P !profile”的时候就表示在当前操作中该profile将不处于激活状态。

    4.4.4根据环境来激活profile

    profile一个非常重要的特性就是它可以根据不同的环境来激活,比如说根据操作系统的不同激活不同的profile,也可以根据jdk版本的不同激活不同的profile,等等。

    4.4.4.1根据jdk来激活profile

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.               <id>profileTest1</id>  
    4.               <jdk>1.5</jdk>  
    5.        </profile>  
    6. <profiles>  

     

           上面情况表示在jdk为1.5版本系列的时候激活profileTest1。

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.               <id>profileTest1</id>  
    4.               <jdk>[1.4,1.7)</jdk>  
    5.        </profile>  
    6. <profiles>  

     

           上面的情况表示在jdk为1.4、1.5和1.6的时候激活profileTest1。

    4.4.4.2根据操作系统来激活profile

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <activation>  
    5.               <os>  
    6.                    <name>Windows XP</name>  
    7.                    <family>Windows</family>  
    8.                    <arch>x86</arch>  
    9.                    <version>5.1.2600</version>  
    10.               </os>  
    11.             </activation>  
    12.        </profile>  
    13. </profiles>  

     

           上面的情况就是根据操作系统的类型来激活profileTest1。

    4.4.4.3根据系统属性来激活profile

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <activation>  
    5.               <property>  
    6.                    <name>hello</name>  
    7.                    <value>world</value>  
    8.               </property>  
    9.             </activation>  
    10.        </profile>  
    11. </profiles>  

     

    上面的profileTest1将在提供了系统属性hello,并且其值为world的时候激活。下面的做法可以激活profileTest1。

    Cmd代码  收藏代码
    1. mvn package –Dhello=world  

     

           当是下面的这种定义形式时,profileTest1将在指定了系统属性hello,且其值为任意值的时候被激活。

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <activation>  
    5.               <property>  
    6.                    <name>hello</name>  
    7.               </property>  
    8.             </activation>  
    9.        </profile>  
    10. </profiles>  

     

    4.4.4.4根据文件是否存在激活profile

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <activation>  
    5.               <file>  
    6.                    <exists>target</exists>  
    7.               </file>  
    8.             </activation>  
    9.        </profile>  
    10. </profiles>  

     

    上面的定义表示当存在target文件时激活profileTest1。

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <activation>  
    5.               <file>  
    6.                    <missing>target</missing>  
    7.               </file>  
    8.             </activation>  
    9.        </profile>  
    10. </profiles>  

     

           上面的定义表示当不存在target文件时激活profileTest1。

    4.5     查看当前处于激活状态的profile

    我们可以同时定义多个profile,那么在建立项目的过程中,到底激活的是哪一个profile呢?Maven为我们提供了一个指令可以查看当前处于激活状态的profile都有哪些,这个指定就是mvn help:active-profiles。

    现在假设我们的settings.xml文件中有如下profile的定义:

    Xml代码  收藏代码
    1. <profiles>  
    2.        <profile>  
    3.             <id>profileTest1</id>  
    4.             <activation>  
    5.               <file>  
    6.                    <missing>target</missing>  
    7.               </file>  
    8.             </activation>  
    9.        </profile>  
    10. </profiles>  
    11.   
    12. <activeProfiles>  
    13.      <activeProfile>profileTest1</activeProfile>  
    14. </activeProfiles>  

     

           这个时候我们可以看到,我们已经定义了profileTest1始终为激活状态,这个时候我们使用mvn help:active-profiles查看处于激活状态的profile时,就会打印出如下内容:


    展开全文
  • ~/.profile和/etc/profile的区别

    千次阅读 2018-11-15 18:36:28
    1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d和/etc/inputrc 2.然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_...

    登入系统读取步骤:

    当登入系统时候获得一个shell进程时,其读取环境设定档有三步 :

    1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d和/etc/inputrc

    2.然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系

    3.然后在根据用户帐号读取~/.bashrc

    /etc/*和~/.*区别:

    /etc/profile,/etc/bashrc 是系统全局环境变量设定

    ~/.profile,~/.bashrc是用户家目录下的私有环境变量设定

    ~/.profile与~/.bashrc的区别:

    都具有个性化定制功能

    ~/.profile可以设定本用户专有的路径,环境变量等,它只在登入的时候执行一次

    ~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次
     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    在~/.profile文件的最下方加入

    export PATH=$PATH:/usr/local/mysql/bin
    展开全文
  • PROFILE 命令总结

    2016-11-28 11:04:37
     ...一、创建 profile CREATE PROFILE LIMIT FAILED_LOGIN_ATTEMPTS 6 PASSWORD_LIFE_TIME 60 PASSWORD_REUSE_TIME 60 PASSWORD_REUSE_MAX 5 PASSWORD_VERIFY_FUNCTION verify_function P
    

    一、创建 profile

    CREATE PROFILE <profile_name> LIMIT
        FAILED_LOGIN_ATTEMPTS 6
        PASSWORD_LIFE_TIME 60
        PASSWORD_REUSE_TIME 60
        PASSWORD_REUSE_MAX 5
        PASSWORD_VERIFY_FUNCTION verify_function
        PASSWORD_LOCK_TIME 1/24
        PASSWORD_GRACE_TIME 90;  
    
    • 密码资源的级别限制(默认:UNLIMITED)
      • FAILED_LOGIN_ATTEMPTS:一般设置5~6次
        指定在帐户被锁定之前所允许尝试登陆的的最大次数。
      • PASSWORD_GRACE_TIME:
        指定宽限天数,数据库发出警告到登陆失效前的天数。如果数据库密码在这中间没有被修改,则过期会失效。
      • PASSWORD_LIFE_TIME:
        指定同一密码所允许使用的天数。如果同时指定了password_grace_time参数,如果在grace period内没有改变密码,则密码会失效,连接数据库被拒绝。如果没有设置password_grace_time参数,默认值unlimited将引发一个数据库警告,但是允许用户继续连接
      • PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX:
        这两个参数必须互相关联设置,password_reuse_time指定了密码不能重用前的天数,而password_reuse_max则指定了当前密码被重用之前密码改变的次数。两个参数都必须被设置为整数。
        注:
      1. 如果为这两个参数指定了整数,则用户不能重用密码直到密码被改变了password_reuse_max指定的次数以后在password_reuse_time指定的时间内。如:password_reuse_time=30,password_reuse_max=10,用户可以在30天以后重用该密码,要求密码必须被改变超过10次。
      2. 如果指定了其中的一个为整数,而另一个为unlimited,则用户永远不能重用一个密码。
      3. 如果指定了其中的一个为default,Oracle数据库使用定义在profile中的默认值,默认情况下,所有的参数在profile中都被设置为unlimited,如果没有改变profile默认值,数据库对该值总是默认为unlimited。
      4. 如果两个参数都设置为unlimited,则数据库忽略他们。
    • PASSWORD_LOCK_TIME:
      指定登陆尝试失败次数到达后,帐户的锁定时间(单位:天)。  
    • PASSWORD_VERIFY_FUNCTION:
      该字段允许将复杂的PL/SQL密码验证脚本做为参数传递到create profile语句。Oracle数据库提供了一个默认的脚本,但是自己可以创建自己的验证规则或使用第三方软件验证。 对Function名称,指定的是密码验证规则的名称,指定为Null则意味着不使用密码验证功能。如果为密码参数指定表达式,则该表达式可以是任意格式,除了数据库标量子查询。
    会话级别的资源限制(默认值:UNLIMITED
    • SESSIONS_PER_USER:
      指定限制用户的并发会话的数目
    • CPU_PER_SESSION:定义了每个SESSION占用的CPU的时间。(单位:1/100 秒)
    • IDLE_TIME:
      指定会话允许连续不活动的总的时间(单位:分钟)。超过该时间,会话将断开。但是长时间运行查询和其他操作的不受此限制。
    • CONNECT_TIME:
      指定会话的总的连接时间。(单位:分钟)
    • LOGICAL_READS_PER_SESSION:
      指定一个会话允许读的数据块的数目,包括从内存和磁盘读的所有数据块。
    • PRIVATE_SGA:
      指定一个会话可以在共享池(SGA)中所允许分配的最大空间(单位:字节)。
      注:该限制只在使用共享服务器结构时才有效,会话在SGA中的私有空间包括私有的SQL和PL/SQL,但不包括共享的SQL和PL/SQL
    • COMPOSITE_LIMIT:
      指定一个会话的总的资源消耗,以service units单位表示。Oracle数据库以有利的方式计算cpu_per_session,connect_time,logical_reads_per_session和private-sga总的service units
    调用级别的资源限制(默认值:UNLIMITED):
    • CPU_PER_CALL:
      指定一次调用(解析、执行和提取)的CPU时间限制。(单位:1/100 秒)
    • LOGICAL_READS_PER_CALL:
      指定一次执行SQL(解析、执行和提取)调用所允许读的数据块的最大数目。

    二、修改profile属性

    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

    三、启用限制

    ALTER SYSTEM SET RESOURCE_LIMIT=TRUE SCOPE=BOTH;

    四、修改用户默认的profile

    ALTER USER user_name PROFILE profile_name;
    展开全文
  • 各种profiler工具 一、GUN Gropf Gprof是GNU profiler工具。可以显示程序运行的“flatprofile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括 函数的调用关系,每个函数...

    目录

    即可即用

    前言 

    详细介绍

    1.1  安装

    1.2  基本用法步骤

    1.3信息解读和工作原理

    工作原理

    生成的信息与解释

    1.3 简单例子

    常用的gprof命令选项 

    资料来源

    其他的一些工具



    即可即用

    1、编译的时候添加 -pg 项

    2、程序必须正常退出(调用exit或从main中返回)生成gmon.out

    3、用Gropf查看gmon.out文件

    $ g++ main.cpp -pg -o main
    $ ./main # 会生成gmon.out性能分析文件
    $ gprof -b main gmon.out > report.txt
    

    这是基本使用方法,更加详细的参见info gprof。最终呈现的统计信息包括两张表:flat table和call graph。flat table列出了各个函数的运行时间(不包括子函数)及所占总运行时间的比率,函数的调用次数;call graph还包括函数之间的调用关系,详细列出了每个函数在它的各个子函数上所耗费的时间。


    前言 

    GNU工具链 (GNU Toolchain) 是一组用于开发应用程序和操作系统的编程工具的集合,这些工具构成了一个完整的系统。GNU工具链包括GCC、GNU Binutils、GNU m4、GNU Autoconf和GNU make等部分。这里主要介绍GCC、Binutils和Glibc。

    GNU Compiler Collection
    GCC全称GNU Compiler Collection,其主要的工具包括cpp、g++、gcc、gcov、gprof

    Gprof是GNU profiler工具

    功能

    Gprof是GNU profiler工具。可以显示程序运行的“flatprofile”,包括每个函数的调用次数每个函数消耗的处理器时间。也可以显示“调用图”,包括 函数的调用关系每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数

    关于Gprof的 使用以及实现原理网上已有多篇文章提及,本文就不再详述,只是对其进行梳理和总结,方便阅读。(Gprof的官方网 址:http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html,http: //sourceware.org/binutils/docs/gprof/index.html 绝对权威的参考资料。)

     

    优劣

    gprof实际上只是一个用于读取profile结果文件的工具。gprof采用混合方法来收集程序的统计信息,它使用检测方法,在编译过程中在函数入口处插入计数器用于收集每个函数的被调用情况和被调用次数;也使用采样方法,在运行时按一定间隔去检查程序计数器并在分析时找出程序计数器对应的函数来统计函数占用的时间。需要注意的是,gprof统计的只是CPU的占用时间,对I/O瓶颈貌似无能为力,耗时甚久的I/O操作很可能只占据极少的CPU时间。

    详细介绍

    1.1  安装

         Glibc自带,无需另外安装

    1.2  基本用法步骤


    1. 使用 -pg 选项编译和链接你的应用程序
     
        在gcc编译程序的时候,加上-pg选项,例如:
        gcc -pg -o test test.c

      这样就生成了可执行文件test。如果是大项目,就在makefile里面修改编译选项,-pg放在那里都行。

    2. 执行你的应用程序使之生成供gprof 分析的数据

        运行刚才的程序:./test,这样就生成了一个gmon.out文件,该文件就包含了profiling的数据。

    3. 使用gprof 分析你的应用程序生成的数据

        gprof test gmon.out > profile.txt
       

    使用上面的命令,gprof就可以分析程序test的性能,将profiling的结果放在profile.txt文件中,打开就可以看到分析的结果。通过对结果的分析来改进我们的程序,从而达到我们的目的。

    GNU gprof是个很不错的工具,大家写程序时可以多用用,用gprof来profiling程序,把耗时最多的函数或运算找出来。

    图形化输出请参考大师blog:http://www.51testing.com/?uid-13997-action-viewspace-itemid-79952

     

    1.3信息解读和工作原理

    工作原理


    在编译或链接源程序的时候在编译器的命令行参数中加入“-pg”选项,编译时编译器会自动在目标代码中插入用于性能测试的代码片断这些代码在程序在运行时采集并记录函数的调用关系和调用次数,以及采集并记录函数自身执行时间和子函数的调用时间,程序运行结束后,会在程序退出的路径下生成一个gmon.out文件。这个文件就是记录并保存下来的监控数据。可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。另外,如果想查看库函数的profiling,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a库,才可以产生库函数的profiling信息。如果想执行一行一行的profiling,还需要加入“-g”编译参数。


    例如如下命令行:
    gcc -Wall -g -pg -lc_p example.c -o example

    执行gprof
    执行如下命令行,即可执行gprof:

    gprof OPTIONS EXECUTABLE-FILE gmon.out BB-DATA [YET-MORE-PROFILE-DATA -FILES...] [> OUTFILE]

     

    prof 实现原理
    通过在编译和链接你的程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or “_mcount” , or “__mcount” , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间、调用次数等等的所有信息。

     

    生成的信息与解释

    Flat Profile的数据解释:

    %time Cumulative seconds Self seconds Calls Self ms/call Total ms/call name
    该函数消耗时间占程序所有时间百分比 函数和上列函数累计执行时间(仅包括gprof能够监控到的函数) 该函数本身执行时间(所有被调用次数的总共时间) 函数被调用次数 函数平均执行时间 函数平均执行时间,包括其衍生函数 函数名

    如何分析呢?

    1. 看%time列, 或者 "self ms/call"列, 这里消耗时间最多的函数就是最耗费CPU的函数了. 也是最值得优化的函数了. (消耗仅统计函数自身的代码消耗, 不统计子函数的消耗)
    2. 看"total ms/call"列, 找到包含子函数在内最耗时间的函数
    3. 从"self ms/call"列和"total ms/call"列对比可知, 如果self ms/call列的值很小,就可以推测子函数消耗时间很多

    一般Flat Profile的数据就够算法竞赛或者日常的小项目的分析了。如果需要Call Graph的分析,参考网上其他的文章。

     %                        the percentage of the total running time of the
    time                     program used by this function.
                               函数使用时间占所有时间的百分比。
    cumulative          a running sum of the number of seconds accounted
     seconds             for by this function and those listed above it.
                               函数和上列函数累计执行的时间。
     self                    the number of seconds accounted for by this
    seconds             function alone.  This is the major sort for this
                              listing.
                              函数本身所执行的时间。
    calls                   the number of times this function was invoked, if
                              this function is profiled, else blank.
                              函数被调用的次数
     self                   the average number of milliseconds spent in this
    ms/call               function per call, if this function is profiled,
                             else blank.
                              每一次调用花费在函数的时间microseconds。
     total                  the average number of milliseconds spent in this
    ms/call               function and its descendents per call, if this 
                              function is profiled, else blank.
                              每一次调用,花费在函数及其衍生函数的平均时间microseconds。
    name                 the name of the function.  This is the minor sort
                              for this listing. The index shows the location of
                              the function in the gprof listing. If the index is
                              in parenthesis it shows where it would appear in
                              the gprof listing if it were to be printed.
                              函数名

     

    1.3 简单例子

    1.打开linux终端。新建一个test.c文件,并生用-pg 编译和链接该文件。

    #include "stdio.h"
    #include "stdlib.h"
    
    void a()
    {
        printf("\t\t+---call a() function\n");
    }
    
    void c()
    {
        printf("\t\t+---call c() function\n");
    }
    
    int b()
    {
        printf("\t+--- call b() function\n");
        a();
        c();
        return 0;
    }
    
    int main()
    {
        printf(" main() function()\n");
        b();
    }

    命令行里面输入下面命令,生成可执行程序test:
     

    [linux /home/test]$gcc -pg test.c -o test

    如果要得到带注释的源码清单,则需要增加 -g 选项。运行: gcc -pg -g -o hello hello.c 


    2.执行你的应用程序使之生成供gprof 分析的数据:

    [linux /home/test]$./test
    main() function()
        +--- call b() function
            +---call a() function
            +---call c() function
    [linux /home/test]$

    你会在当前目录下看到一个gmon.out 文件, 这个文件就是供gprof 分析使用的。

    3.使用gprof 程序分析你的应用程序生成的数据:

    [linux /home/test]$ gprof -b test gmon.out | less
    1. gprof hello gmon.out -p 得到每个函数占用的执行时间 
    2. gprof hello gmon.out -q 得到call graph,包含了每个函数的调用关系,调用次数,执行时间等信息。 
    3. gprof hello gmon.out -A 得到一个带注释的“源代码清单”,它会注释源码,指出每个函数的执行次数。这需要在编译的时候增加 -g选项。

    由于gprof输出的信息比较多,这里使用了 less 命令,该命令可以让我们通过上下方向键查看gprof产生的输出,|表示gprof -b test gmon.out 的输出作为 less的输入。下面是我从gprof输出中摘抄出的与我们有关的一些详细信息。

    Flat profile:
     
    Each sample counts as 0.01 seconds.
     no time accumulated
     
      %   cumulative   self              self     total
     time   seconds   seconds    calls  Ts/call  Ts/call  name
      0.00      0.00     0.00        1     0.00     0.00  a
      0.00      0.00     0.00        1     0.00     0.00  b
      0.00      0.00     0.00        1     0.00     0.00  c
    
    
    
                            Call graph
    
    
    granularity: each sample hit covers 4 byte(s) no time propagated
     
    index % time    self  children    called     name
                    0.00    0.00       1/1           b [2]
    [1]      0.0    0.00    0.00       1         a [1]
    -----------------------------------------------
                    0.00    0.00       1/1           main [10]
    [2]      0.0    0.00    0.00       1         b [2]
                    0.00    0.00       1/1           c [3]
                    0.00    0.00       1/1           a [1]
    -----------------------------------------------
                    0.00    0.00       1/1           b [2]
    [3]      0.0    0.00    0.00       1         c [3]
    -----------------------------------------------
    
    Index by function name
     
       [1] a                       [2] b                       [3] c


     

    从上面的输出我们能明显的看出来,main 调用了 b 函数, 而b 函数分别调用了a 和 c 函数。由于我们的函数只是简单的输出了一个字串,故每个函数的消耗时间都是0 秒。

    常用的gprof命令选项 

    常用的gprof命令选项: 


    -b            不再输出统计图表中每个字段的详细描述。 
    -p            只输出函数的调用图(Call graph的那部分信息)。
    -q            只输出函数的时间消耗列表。
    -e Name       不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。
    -E Name       不再输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。
    -f Name       输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。 
    -F Name       输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。 
    -z           显示使用次数为零的例程(按照调用计数和累积时间计算)。

    使用注意:
    1)一般gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a库,才可以产生库函数的profiling信息。
    2) gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:

    static void sighandler( int sig_no )   
    {   
          exit(0);   
    }   
    signal( SIGUSR1, sighandler );

    当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。

    1. 通常gprof的采样周期是0.01s,统计项越接近这个值误差可能越大。若函数的运行时间低于0.01S,统计值会显示为0。
    2. 多线程下,gprof只能采集主线程性能数据。原因是gprof采用ITIMER_PROF信号,在多线程内,只有主线程才能响应该信号。解决的关键是让各个线程响应ITIMER_PROF信号,就是重写pthread_create函数。
    3. 一般gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入"-lc_p"编译参数代替"-lc"编译参数,这样程序会链接libc_p.a库,才可以产生库函数的profiling信息。

     

    资料来源

    《C++ Profiler工具》https://blog.csdn.net/darlingqiang/article/details/79159019

    用profile协助程序性能优化 python》https://www.cnblogs.com/pyxiaomangshe/p/8023404.html

    Linux下程序的Profile工具https://www.cnblogs.com/no7dw/archive/2012/10/17/2727692.html

    其他的一些工具

    见https://blog.csdn.net/chdhust/article/details/41073885与https://blog.csdn.net/feilengcui008/article/details/51306894。

    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。

    展开全文
  • @Profile注解详解

    万次阅读 多人点赞 2019-06-12 22:52:35
    @Profile注解详解 @Profile: Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能; 开发环境develop、测试环境test、生产环境master 数据源:(/dev) (/test) (/master) @Profile:指定组件...
  • .profile 文件

    千次阅读 2018-08-13 16:08:01
    Unix/Linux有两个profile文件 1./etc/profile:是全局profile文件,设置后会影响到所有用户 2./home/username/.profile或.bash_profile是针对特定用户的,可以针对用户,来配置自己的环境变量。 注意:profile是unix...
  • Profile

    2019-12-31 14:10:26
    Profile 1、application.properties 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置 在application.properties中使用 spring....
  • maven(三)最详细的profile的使用

    万次阅读 多人点赞 2018-11-25 19:55:08
    文章目录前言1. 原理2. 应用演示2.1 项目结构2.2 激活方式1. 通过maven命令参数2. 通过pom文件里的activation属性3. settings.xml中使用activeProfiles指定(了解即可) 前言 &amp;amp;amp;...在
  • Profile 是什么意思

    千次阅读 2010-04-26 10:49:00
    计算机中常用的 Profile 该如何理解? profile 本身意思是剖面, 侧面, 外形, 轮廓。但现在常用这个字时,它的含义更进一层 简介,档案my profile 表示我的个人信息。For example, if you are writing an eCommerce...
  • 为使Bash更好地为我们服务,我们需定制bash shell环境。 ~/.bash_profile、~/.bashrc、和~/.bash_logout 1.上面这三个文件是bash shell的用户环境配置文件,位于用户的主目录下。....profile(由Bourne
  • Mac 打开、编辑 .bash_profile 文件

    万次阅读 2018-07-03 09:06:05
    一般在Mac上配置环境变量时经常要创建、编辑 .bash_profile文件。 创建该文件时一般都会选择在当前用户目录下,即Mac下的.bash_profile 文件的路径是 /Users/YourMacUserName/.bash_profile (如果该文件已经创建过...
  • 1 . .bash_profile 2 source .bash_profile 3 exec bash --login
  • MAC 打开.bash_profile

    万次阅读 2014-11-28 09:00:00
    MAC 打开.bash_profile 1. 启动终端Terminal 2. 进入当前用户的home目录  输入cd ~ 3. 创建.bash_profile  输入touch .bash_profile 4. 编辑.bash_profile文件  输入open -e .bash_...
  • linux下修改/etc/profile文件

    万次阅读 2017-01-06 14:30:12
    通常情况下,/etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的。要修改profile,需要取得root权限,(使用gedit编辑)应该如下: $sudo gedit /etc/profile 或者 $sudo -s $gedit /etc...
  • 自己在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置的不生效.需要重新执行 : $source ~/.bash_profile 发现zsh加载的是 ~/.zshrc文件,而 ‘.zshrc’ 文件中并没有定义任务环境变量。 解决办法 在...
  • 请问.bash_profile文件在linux的哪里

    万次阅读 2016-07-31 23:30:17
    .bash_profile文件存在于用户主目录下,绝对路径为/home/$name/.bash_profile .bash_profile文件是隐藏文件,里面包含的是用户的用户的环境变量。 在/home下的用户文件夹下,查看一下隐藏文件 这个文件不一定存在...
  • 在登录Linux时要执行文件的过程如下:在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/....
  • linux系统更新profile文件立即生效

    万次阅读 2018-09-27 20:05:14
    我们在linux系统中更新了配置文件profile文件以后,并不会立即生效,需要我们执行一下相关的命令才会立即生效: 方法一:让/etc/profile文件修改后立即生效 ,可以使用如下命令: # . /etc/profile 注意: . 和 /etc/...
  • /etc/profile是全局的,是私有的 /etc/profile用于整个系统所有用户, ~/.bash_profile, ~/.profile和~/.bashrc 用于各个用户,这里的"~"符号就是各当前用户的$HOME ~/.bash_profile 和 ~/.profile 只在登陆时...
  • 本文地址:http://blog.csdn.net/shanglianlm/article/details/49420757 vim /etc/profile 写入时 出现 E121:无法打开并写入文件解决方案
1 2 3 4 5 ... 20
收藏数 586,667
精华内容 234,666
关键字:

profile