123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <title>Metrix++ Project</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="description" content="">
- <meta name="author" content="">
- <!-- Le styles -->
- <!--
- <link href="../../style.css" rel="stylesheet">
- -->
- <link href="assets/css/bootstrap.css" rel="stylesheet">
- <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">
- <link href="assets/css/docs.css" rel="stylesheet">
- <link href="assets/js/google-code-prettify/prettify.css" rel="stylesheet">
-
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <script src="assets/js/html5shiv.js"></script>
- <![endif]-->
- <!-- Le fav and touch icons -->
- <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">
- <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png">
- <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png">
- <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png">
- <link rel="shortcut icon" href="assets/ico/favicon.png">
- <!--
- <script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-146052-10']);
- _gaq.push(['_trackPageview']);
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
- </script>
- -->
- </head>
- <body data-spy="scroll" data-target=".bs-docs-sidebar">
- <!-- Navbar
- ================================================== -->
- <div class="navbar navbar-link navbar-fixed-top">
- <div class="navbar-inner">
- <div class="container">
- <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="brand" href="./index.html">Metrix++</a>
- <div class="nav-collapse collapse">
- <ul class="nav">
- <li class="">
- <a href="./index.html">Home</a>
- </li>
- <li class="">
- <a href="./customize.html"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=275605&type=10" alt="Get Software Index at SourceForge.net. Fast, secure and Free Open Source software downloads" border="0"></a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- <!-- Subhead
- ================================================== -->
- <header class="jumbotron" id="overview">
- <div id="myCarousel" class="carousel slide">
- <div class="carousel-inner">
- <div class="item active">
- <img src="assets/img/slide-01.jpg" alt="">
- <div class="container">
- <div class="carousel-caption">
- <h2>Multiple languages</h2>
- <p class="lead">· C/C++, C# and Java.</p>
- <p class="lead">· Recognises classes, interfaces, namespaces, functions, comments, preprocessor and much more.</p>
- </div>
- </div>
- </div>
- <div class="item">
- <img src="assets/img/slide-02.jpg" alt="">
- <div class="container">
- <div class="carousel-caption">
- <h2>Multiple metrics</h2>
- <p class="lead">· Complexity, size and other.</p>
- </div>
- </div>
- </div>
- <div class="item">
- <img src="assets/img/slide-03.jpg" alt="">
- <div class="container">
- <div class="carousel-caption">
- <h2>High performance and scalability</h2>
- <p class="lead">· Applicable to huge code bases: thousands of files per minute.</p>
- <p class="lead">· Ultra-fast feedback on iterative re-run.</p>
- </div>
- </div>
- </div>
- <div class="item">
- <img src="assets/img/slide-01.jpg" alt="">
- <div class="container">
- <div class="carousel-caption">
- <h2>Effortless application to legacy code</h2>
- <p class="lead">· Recognises legacy, modified and new code.</p>
- <p class="lead">· Prevents from negative trends. Encourages positive.</p>
- </div>
- </div>
- </div>
- <div class="item">
- <img src="assets/img/slide-02.jpg" alt="">
- <div class="container">
- <div class="carousel-caption">
- <h2>Configurable</h2>
- <p class="lead">· Define and apply your rules and policies.</p>
- <p class="lead">· Integrate with your workflow.</p>
- </div>
- </div>
- </div>
- <div class="item">
- <img src="assets/img/slide-03.jpg" alt="">
- <div class="container">
- <div class="carousel-caption">
- <h2>Extendable via plugins</h2>
- <p class="lead">· Define your custom metric.</p>
- <p class="lead">· Add new language parser.</p>
- <p class="lead">· Create advanced post-analysis tool.</p>
- </div>
- </div>
- </div>
- </div>
- <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>
- <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>
- </div>
- <div class="container">
- <div class="row">
- <div class="span3">
- </div>
- <div class="span9">
- <h5 class="text-right">Management of source code quality is possible.</h5>
- <p class="text-right">
- <a href="https://sourceforge.net/projects/metrixplusplus/files/latest/download"
- ><button type="button"class="btn btn-danger">Download</button></a>
- <!--
- <button type="button"class="btn btn-warning">Donate</button>
- -->
- </p>
- </div>
- </div>
- </div>
- </header>
- <div class="container"><div class="row">
-
- <!-- Docs nav
- ================================================== -->
- <div class="span3 bs-docs-sidebar">
- <ul class="nav nav-list bs-docs-sidenav">
- <!--<li><img src="../../logo_project.png"/><p> </p></li>-->
- <li><a href="#overview_section"><i class="icon-chevron-right"></i> Overview</a></li>
- <li><a href="#download_section"><i class="icon-chevron-right"></i> Download & Install</a></li>
- <li><a href="#workflow_collect_section"><i class="icon-chevron-right"></i> Workflow: Collect data</a></li>
- <li><a href="#workflow_view_section"><i class="icon-chevron-right"></i> Workflow: View data</a></li>
- <li><a href="#workflow_view_summary_section"><i class="icon-hand-right"></i> · summary & distributions</a></li>
- <li><a href="#workflow_view_details_section"><i class="icon-hand-right"></i> · details per file/region</a></li>
- <li><a href="#workflow_limit_section"><i class="icon-chevron-right"></i> Workflow: Apply thresholds</a></li>
- <li><a href="#workflow_limit_hotspots_section"><i class="icon-hand-right"></i> · hotspots</a></li>
- <li><a href="#workflow_limit_control_section"><i class="icon-hand-right"></i> · controlling trends</a></li>
- <li><a href="#workflow_other_section"><i class="icon-chevron-right"></i> Workflow: Other applications</a></li>
- <li><a href="#extend_section"><i class="icon-chevron-right"></i> Create plugin</a></li>
- <li><a href="#contribute_section"><i class="icon-chevron-right"></i> Feedback & Contribute</a></li>
- </ul>
- </div>
-
- <!-- Sections
- ================================================== -->
- <div class="span9">
- <!-- Overview
- ================================================== -->
- <section id="overview_section">
- <div class="page-header">
- <h1>Overview</h1>
- </div>
- <h3>Highlights</h3>
- <p>Metrix++ is a tool to collect and analyse code metrics. Any metric is useless if it is not used.
- Metrix++ offers great usage capabilities and assists with variety of application use cases:</p>
- <ul>
- <li>Monitoring trends on <strong>daily</strong> basis. In order to take actions or make right decisions earlier.</li>
- <li>Enforcing trends on <strong>hourly</strong> basis, at every commit of code changes. In order to control quality in time, i.e. when it is not too late to redo.</li>
- <li>Assisiting on <strong>per minute</strong> basis during code refactoring and code development, where coding and quality standards matter.</li>
- </ul>
- <p>The workflow sections below demonstarate basic application usecases.</p>
- <h3>Languages supported</h3>
- <p>The tool can parse C/C++, C# and Java source code files. The parser identifies certain regions in the code,
- such as classes, functions, namespaces, interfaces, etc. It obviously detects comments, strings and code for preprocessor.
- The identified regions form a tree of nested source code blocks, which are refered after and additionally scanned by metrics plugins.
- This concept allows to attribute metrics per regions, what gives fine grained data and rich input to analysis tools.
- The following example demonstrates regions concept.</p>
-
- <table class="table">
- <thead>
- <tr>
- <th>Source code</th>
- <th>Regions tree [type: name: content type]</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <pre class="prettyprint linenums">
- // simple C++ code
- #include <myapi.h>
- // I explain the following class
- class MyClass {
- public:
- int m_var; // some member
- // I explain the following function
- MyClass(): m_var(0) {
- char str[] = "unused string"
-
- // nested region for good measure
- struct MyStruct {};
- }
-
- // Do not judge ugly code below
- #define get_max(a,b) ((a)>(b)?(a):(b))
- set_max(int b) {
- m_var = get_max(m_var, b);
- }
- };
- // this is the last line
- </pre>
- </td>
- <td>
- <pre class="prettyprint linenums">
- file: __global__: comment
- file: __global__: code
- file: __global__: preprocessor
- file: __global__: code
- class: MyClass: comment
- class: MyClass: code
- class: MyClass: code
- class: MyClass: code, comment
- class: MyClass: code
- function: MyClass: comment
- function: MyClass: code
- function: MyClass: code, string
- function: MyClass: code
- struct: MyStruct: comment
- struct: MyStruct: code
- function: MyClass: code
- class: MyClass: code
- function: set_max: comment
- function: set_max: preprocessor
- function: set_max: code
- function: set_max: code
- function: set_max: code
- class: MyClass: code
- file: __global__: comment
- </pre>
- </td>
- </tr>
- </tbody>
- </table>
- <h3>Metrics</h3>
- <p>Metrics highlighed in blue are <strong>per file</strong> metrics. Other metrics are <strong>per region</strong> metrics.
- Region term is explained in the previous chapter.</p>
- <table class="table table-bordered">
- <thead>
- <tr>
- <th>Metric (enable option)</th>
- <th>Brief description</th>
- <th>Motivation</th>
- </tr>
- </thead>
- <tbody>
- <tr class="info">
- <td>std.general.size</td>
- <td>Size of a file in bytes.</td>
- <td rowspan="4"><ul><li>Monitoring growth of source code base.</li>
- <li>Normalizing other metrics.</li>
- <li>Preventing large files and regions (large things difficult to maintain).</li>
- <li>Predicting delivery dates by comparing
- <a href="http://www.compaid.com/caiInternet/casestudies/kanarticle2.pdf">S-shaped code base growth / change curves</a>.</li></ul></td>
- </tr>
- <tr>
- <td>std.code.length.total</td>
- <td>The same as 'std.general.size' metric, but attributed to code regions.</td>
- <td></td>
- </tr>
- <tr>
- <td>std.code.lines.total</td>
- <td>Number of non-blank lines of code of any content type (exectuable, comments, etc.)</td>
- <td></td>
- </tr>
- <tr>
- <td>std.code.lines.code</td>
- <td>Number of non-blank lines of code excluding preprocessor and comments.</td>
- <td></td>
- </tr>
- <tr>
- <td>std.code.lines.preprocessor</td>
- <td>Number of non-blank lines of preprocessor code.</td>
- <td><ul><li>Enforcing localisation of preprocessor code in a single place.</li>
- <li>Encouraging usage of safer code structures instead of preprocessor.</li></ul></td>
- </tr>
- <tr>
- <td>std.code.lines.comments</td>
- <td>Number of non-blank lines of comments.</td>
- <td><ul><li>Low number of comments may indicate about maintainability problems.</li></ul></td>
- </tr>
- <tr>
- <td>std.code.complexity.cyclomatic</td>
- <td>McCabe cyclomatic complexity metric.</td>
- <td><ul><li>Identification of highly complex code for review and refactoring.</li>
- <li>Preventing complex functions (complexity is a reason of many defects and a reason of expensive maintaintenance).</li></ul></td>
- </tr>
- <tr>
- <td>std.suppress</td>
- <td>An option enables collection of Metrix++ suppressions and 2 metrics: 'std.suppress:count' and
- 'std.suppress.file:count'. The first is number of suppressions per region.
- The second is the same but applies for file-scope metrics.</td>
- <td><ul><li>Suppressing false-positives.</li>
- <li>Managing the amount of suppressions. Usually there are no false-positives to suppress with the right metric,
- but could be exceptions in specific cases. Managing suppressions is about managing exceptions.
- If there are many exceptional cases, maybe something is wrong with a metric or an application of a metric.</li></ul></td>
- </tr>
- <tr class="info">
- <td>std.general.procerrors</td>
- <td>Number of errors detected by Metrix++ code parser.
- Errors, like mismatched brackets, may result in bad identification of regions.</td>
- <td><ul><li>Cleaning up errors to ensure reliable code scanning.</li></ul></td>
- </tr>
- <tr class="info">
- <td>std.general.proctime</td>
- <td>Seconds spent on processing a file.</td>
- <td><ul><li>Monitor and profile tool's performance.</li></ul></td>
- </tr>
- </tbody>
- </table>
- </section>
- <section id="download_section">
- <div class="page-header">
- <h1>Download & Install</h1>
- </div>
- <p>In order to get the tool working, <a href="https://sourceforge.net/projects/metrixplusplus/files/latest/download">dowload the archive</a> with the latest stable version
- and unpack it to some folder. First run of the tool will trigger the installation within the folder,
- where it was launched.</p>
- <p>Corresponding checkout from the <a href="https://sourceforge.net/p/metrixplusplus/code">version control system</a> is the following:</p>
- <pre>svn checkout <a href="https://sourceforge.net/p/metrixplusplus/code">svn://svn.code.sf.net/p/metrixplusplus/code</a>/releases/latest Metrix++</pre>
- <p>In order to checkout the latest version under development, use this command:</p>
- <pre>svn checkout <a href="https://sourceforge.net/p/metrixplusplus/code">svn://svn.code.sf.net/p/metrixplusplus/code</a>/mainline Metrix++</pre>
- <h4>Prerequisites</h4>
- <p>Python Runtime Environment (version 2.7.* or later, version 3.* has not been tested)</p>
- <h4>License</h4>
- <p>This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; version 3 of the License.</p>
- <p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.</p>
- <p>You should have received a copy of the GNU General Public License along with the Metrix++;
- if not, contact <a href="mailto:avkonst@users.sourceforge.net?subject=Metrix%2B%2B License">Project Administrator</a></p>
-
- </section>
- <div class="page-header">
- <h1>Workflow</h1>
- </div>
- <p>The workflow and application usecases are demonstrated using source code of
- <a href="http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess.html">boost/interprocess</a> library.
- Boost versions 1.52 and 1.54 are used and refered below as 'previous' and 'current' accordingly.</p>
- <section id="workflow_collect_section">
- <h2>Collect data</h2>
- <p>The first obvious step is to collect the data.
- The 'collect' tool has got multiple options to enable various metrics plugins.
- Let's collect number of lines of code and cyclomatic complexity metrics
- for the previous (1.52.0 version) boost interprocess library. Assuming that 2 versions of boost library
- are unpacked in the current working directory:</p>
- <pre>
- > cd boost_1_52_0
- > python "/path/to/metrix++.py" collect --std.code.lines.code --std.code.complexity.cyclomatic -- boost/interprocess
- > cd ../ # return back to working directory
- </pre>
- <p>The list of arguments after '--' enumerates paths where to read source files.
- As a result of execution of this command, a file metrixpp.db will be written in the current working directory.
- It can be redefined with help of --db-file option.</p>
- <p>Metrix++ has got rich functionality in comparing code bases and reducing processing scope to modified or new code.
- So, let's collect the same data for the current (1.54.0 version) boost interprocess library.</p>
- <pre>
- > cd boost_1_54_0
- > python "/path/to/metrix++.py" collect --std.code.lines.code --std.code.complexity.cyclomatic -- boost/interprocess --db-file-prev=../boost_1_52_0/metrixpp.db
- > cd ../ # return back to working directory
- </pre>
- <p>The option --db-file-prev points out to the file with data collected in the previous step.
- So, eventually it executed iterative collection. It can speed up the exectuion significantly,
- depending on amount of changes between two version.</p>
- <p>Check other options of the collect tool by executing:</p>
- <pre>
- > python "/path/to/metrix++.py" collect --help
- </pre>
- </section>
- <section id="workflow_view_section">
- <h2>View data</h2>
- </section>
- <section id="workflow_view_summary_section">
- <h3>Summary metrics and distribution tables/graphs</h3>
- <p>It is time to look at the data. The command:</p>
- <pre>
- > python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db
- </pre>
- <p>prints summary metrics, like minimum/maximum, and distribution/frequency tables:</p>
- <pre>
- :: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
- Average : 0.652902698283
- Minimum : 0
- Maximum : 37
- Total : 1597.0
- Distribution : 2446 regions in total (including 0 suppressed)
- Metric value : Ratio : R-sum : Number of regions
- 0 : 0.771 : 0.771 : 1886 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- 1 : 0.110 : 0.881 : 268 |||||||||||
- 2 : 0.044 : 0.925 : 108 ||||
- 3 : 0.025 : 0.949 : 60 ||
- 4 : 0.016 : 0.966 : 40 ||
- 5 : 0.007 : 0.973 : 18 |
- 6 : 0.006 : 0.979 : 14 |
- 7 : 0.004 : 0.983 : 10
- 8 : 0.003 : 0.986 : 8
- 9 : 0.002 : 0.988 : 4
- 10 : 0.004 : 0.991 : 9
- 11 : 0.002 : 0.993 : 4
- 12 : 0.001 : 0.994 : 3
- 13 : 0.001 : 0.995 : 2
- 14 : 0.001 : 0.996 : 2
- 15-16 : 0.001 : 0.997 : 3
- 17-18 : 0.001 : 0.998 : 3
- 20 : 0.000 : 0.999 : 1
- 23-25 : 0.001 : 1.000 : 2
- 37 : 0.000 : 1.000 : 1
- :: info: Overall metrics for 'std.code.lines:code' metric
- Average : 6.64356984479
- Minimum : 0
- Maximum : 201
- Total : 23970.0
- Distribution : 3608 regions in total (including 0 suppressed)
- Metric value : Ratio : R-sum : Number of regions
- 0-1 : 0.088 : 0.088 : 319 |||||||||
- 2 : 0.320 : 0.409 : 1155 ||||||||||||||||||||||||||||||||
- 3 : 0.108 : 0.517 : 390 |||||||||||
- 4 : 0.081 : 0.598 : 294 ||||||||
- 5 : 0.080 : 0.678 : 290 ||||||||
- 6 : 0.061 : 0.739 : 220 ||||||
- 7 : 0.049 : 0.788 : 176 |||||
- 8 : 0.030 : 0.818 : 109 |||
- 9 : 0.025 : 0.843 : 89 ||
- 10-11 : 0.032 : 0.876 : 117 |||
- 12-13 : 0.020 : 0.895 : 71 ||
- 14 : 0.012 : 0.907 : 43 |
- 15-16 : 0.017 : 0.924 : 61 ||
- 17-19 : 0.015 : 0.939 : 55 ||
- 20-22 : 0.013 : 0.952 : 46 |
- 23-26 : 0.011 : 0.963 : 40 |
- 27-30 : 0.009 : 0.972 : 33 |
- 31-39 : 0.009 : 0.981 : 33 |
- 40-65 : 0.009 : 0.991 : 34 |
- 66-201 : 0.009 : 1.000 : 33 |
- :: info: Directory content:
- Directory : .
- </pre>
- <p>The same command with --db-file-prev option enables comparision and change trends are shown in [] brackets:</p>
- <pre>
- > python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db
- </pre>
- <pre>
- :: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
- Average : 0.652902698283 [+0.00362138411453]
- Minimum : 0 [+0]
- Maximum : 37 [+1]
- Total : 1597.0 [+16.0]
- Distribution : 2446 [+11] regions in total (including 0 [+0] suppressed)
- Metric value : Ratio : R-sum : Number of regions
- 0 : 0.771 : 0.771 : 1886 [+5 ] |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- 1 : 0.110 : 0.881 : 268 [+4 ] |||||||||||
- 2 : 0.044 : 0.925 : 108 [+0 ] ||||
- 3 : 0.025 : 0.949 : 60 [+2 ] ||
- 4 : 0.016 : 0.966 : 40 [-1 ] ||
- 5 : 0.007 : 0.973 : 18 [-1 ] |
- 6 : 0.006 : 0.979 : 14 [+1 ] |
- 7 : 0.004 : 0.983 : 10 [+1 ]
- 8 : 0.003 : 0.986 : 8 [+1 ]
- 9 : 0.002 : 0.988 : 4 [+0 ]
- 10 : 0.004 : 0.991 : 9 [-2 ]
- 11 : 0.002 : 0.993 : 4 [+1 ]
- 12 : 0.001 : 0.994 : 3 [+0 ]
- 13 : 0.001 : 0.995 : 2 [+0 ]
- 14 : 0.001 : 0.996 : 2 [+0 ]
- 15-16 : 0.001 : 0.997 : 3 [-1 ]
- 17-18 : 0.001 : 0.998 : 3 [+1 ]
- 20 : 0.000 : 0.999 : 1 [+0 ]
- 23-25 : 0.001 : 1.000 : 2 [+0 ]
- 36-37 : 0.000 : 1.000 : 1 [+0 ]
- :: info: Overall metrics for 'std.code.lines:code' metric
- Average : 6.64356984479 [+0.012181964309]
- Minimum : 0 [+0]
- Maximum : 201 [+4]
- Total : 23970.0 [+223.0]
- Distribution : 3608 [+27] regions in total (including 0 [+0] suppressed)
- Metric value : Ratio : R-sum : Number of regions
- 0-1 : 0.088 : 0.088 : 319 [+3 ] |||||||||
- 2 : 0.320 : 0.409 : 1155 [+9 ] ||||||||||||||||||||||||||||||||
- 3 : 0.108 : 0.517 : 390 [-3 ] |||||||||||
- 4 : 0.081 : 0.598 : 294 [+7 ] ||||||||
- 5 : 0.080 : 0.678 : 290 [+7 ] ||||||||
- 6 : 0.061 : 0.739 : 220 [-1 ] ||||||
- 7 : 0.049 : 0.788 : 176 [-2 ] |||||
- 8 : 0.030 : 0.818 : 109 [-1 ] |||
- 9 : 0.025 : 0.843 : 89 [+4 ] ||
- 10-11 : 0.032 : 0.876 : 117 [+9 ] |||
- 12-13 : 0.020 : 0.895 : 71 [-9 ] ||
- 14 : 0.012 : 0.907 : 43 [+0 ] |
- 15-16 : 0.017 : 0.924 : 61 [+0 ] ||
- 17-19 : 0.015 : 0.939 : 55 [+6 ] ||
- 20-22 : 0.013 : 0.952 : 46 [-3 ] |
- 23-26 : 0.011 : 0.963 : 40 [+2 ] |
- 27-30 : 0.009 : 0.972 : 33 [-3 ] |
- 31-39 : 0.009 : 0.981 : 33 [+0 ] |
- 40-65 : 0.009 : 0.991 : 34 [+1 ] |
- 66-201 : 0.009 : 1.000 : 33 [+1 ] |
- :: info: Directory content:
- Directory : .
- </pre>
- <h4>Reducing analysis scope</h4>
- <p>There are two ways to reduce the analysis scope for the view tool. The first is to enumerate paths of interest.
- For example, the following command reduces scope to 'allocators' sub-directory within the processed code.</p>
- <pre>
- > python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db -- ./boost/interprocess/allocators
- </pre>
- <p>The second is to specify --scope-mode option, which instructs the tool to process only modified and/or new files/regions.
- For example, view the summary metrics for all modified and new regions:</p>
- <pre>
- > python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db --scope-mode=touched
- </pre>
- <pre>
- :: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
- Average : 1.84924623116 [-0.0230941943761]
- Minimum : 0 [+0]
- Maximum : 37 [+1]
- Total : 368.0 [+16.0]
- Distribution : 199 [+11] regions in total (including 0 [+0] suppressed)
- Metric value : Ratio : R-sum : Number of regions
- 0 : 0.608 : 0.608 : 121 [+5 ] |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- 1 : 0.131 : 0.739 : 26 [+4 ] |||||||||||||
- 2 : 0.070 : 0.809 : 14 [+0 ] |||||||
- 3 : 0.060 : 0.869 : 12 [+2 ] ||||||
- 4 : 0.015 : 0.884 : 3 [-1 ] ||
- 5 : 0.015 : 0.899 : 3 [-1 ] ||
- 6 : 0.005 : 0.905 : 1 [+1 ] |
- 7 : 0.015 : 0.920 : 3 [+1 ] ||
- 8 : 0.015 : 0.935 : 3 [+1 ] ||
- 9 : 0.010 : 0.945 : 2 [+0 ] |
- 10 : 0.010 : 0.955 : 2 [-2 ] |
- 11 : 0.005 : 0.960 : 1 [+1 ] |
- 12 : 0.005 : 0.965 : 1 [+0 ] |
- 13 : 0.005 : 0.970 : 1 [+0 ] |
- 16 : 0.005 : 0.975 : 1 [-1 ] |
- 17 : 0.005 : 0.980 : 1 [+0 ] |
- 18 : 0.010 : 0.990 : 2 [+1 ] |
- 20 : 0.005 : 0.995 : 1 [+0 ] |
- 36-37 : 0.005 : 1.000 : 1 [+0 ] |
- :: info: Overall metrics for 'std.code.lines:code' metric
- Average : 15.9645390071 [-0.815853149771]
- Minimum : 0 [+0]
- Maximum : 201 [+6]
- Total : 4502.0 [+223.0]
- Distribution : 282 [+27] regions in total (including 0 [+0] suppressed)
- Metric value : Ratio : R-sum : Number of regions
- 0-1 : 0.053 : 0.053 : 15 [+3 ] |||||
- 2 : 0.124 : 0.177 : 35 [+9 ] ||||||||||||
- 3 : 0.053 : 0.230 : 15 [-3 ] |||||
- 4 : 0.060 : 0.291 : 17 [+7 ] ||||||
- 5 : 0.089 : 0.379 : 25 [+7 ] |||||||||
- 6 : 0.060 : 0.440 : 17 [-1 ] ||||||
- 7 : 0.050 : 0.489 : 14 [-2 ] |||||
- 8-9 : 0.074 : 0.564 : 21 [+3 ] |||||||
- 10 : 0.035 : 0.599 : 10 [+5 ] ||||
- 11 : 0.082 : 0.681 : 23 [+4 ] ||||||||
- 12-13 : 0.043 : 0.723 : 12 [-9 ] ||||
- 14-15 : 0.039 : 0.762 : 11 [-1 ] ||||
- 16-18 : 0.028 : 0.791 : 8 [+4 ] |||
- 19-22 : 0.039 : 0.830 : 11 [+0 ] ||||
- 23-26 : 0.039 : 0.869 : 11 [+2 ] ||||
- 27-32 : 0.028 : 0.897 : 8 [-3 ] |||
- 38-50 : 0.025 : 0.922 : 7 [+0 ] ||
- 51-69 : 0.025 : 0.947 : 7 [+1 ] ||
- 71-100 : 0.032 : 0.979 : 9 [+2 ] |||
- 101-201 : 0.021 : 1.000 : 6 [-1 ] ||
- :: info: Directory content:
- Directory : .
- </pre>
- </section>
- <section id="workflow_view_details_section">
- <h3>Detailed metrics per file/region</h3>
- <p>The same view tool can print detailed metrics per file and per every region in the specified file.
- In order to get detailed metrics, enumerate files of interest after '--'. For example:</p>
- <pre>
- > python "/path/to/metrix++.py" view --db-file=boost_1_54_0/metrixpp.db --db-file-prev=boost_1_52_0/metrixpp.db -- ./boost/interprocess/detail/managed_open_or_create_impl.hpp
- </pre>
- <p>produces output similar to this (truncated to make the page shorter):</p>
- <pre>
- ./interprocess/detail/managed_open_or_create_impl.hpp:302: info: Metrics per 'priv_open_or_create' region
- Region name : priv_open_or_create
- Region type : function
- Offsets : 8314-14526
- Line numbers : 301-467
- Modified : True
- std.code.complexity:cyclomatic: 37 [+1]
- std.code.lines:code: 148 [+4]
- </pre>
- </section>
- <section>
- <h3>More about the viewer</h3>
- <p>The 'view' command has got an option to alter the output format. It is possible to get the same data
- in xml pr python disctionary formats. This can be particularly useful for integration of the tool with
- other applications. For example, an editor may re-collect and show context based metrics when a file is saved.</p>
- <pre>
- > python "/path/to/metrix++.py" view --format=xml
- </pre>
- <p>Check other options of the view tool by executing:</p>
- <pre>
- > python "/path/to/metrix++.py" view --help
- </pre>
- </section>
- <section id="workflow_limit_section">
- <h2>Apply thresholds</h2>
- <p>...</p>
- </section>
- <section id="workflow_limit_hotspots_section">
- <h3>Suppressions</h3>
- <p>Metrix++ has got suppressions capability. Suppressions are collected from comments in code
- and used by post-processing tools, like 'limit'. It allows to take fine grained control
- over false-positive warnings, if there are.</p>
- </section>
- <section id="workflow_limit_control_section">
- <h3>Suppressions</h3>
- <p>Metrix++ has got suppressions capability. Suppressions are collected from comments in code
- and used by post-processing tools, like 'limit'. It allows to take fine grained control
- over false-positive warnings, if there are.</p>
- </section>
- <section id="extend_section">
- <div class="page-header">
- <h1>Create plugin</h1>
- </div>
- <h2>New metric</h2>
- <p>describe METRIXPLUSPLUS_PATH environment variable</p>
- <h2>New language</h2>
- <p>...</p>
- <h2>New analysis tool</h2>
- <p>...</p>
- </section>
- <section id="contribute_section">
- <div class="page-header">
- <h1>Feeback and contribute</h1>
- </div>
- <h2>Feedback</h2>
- <p>...</p>
- </section>
- </div> <!-- end for sections -->
- </div></div> <!-- end for row and container -->
- <!-- Footer
- ================================================== -->
- <footer class="footer">
- <div class="container">
- <p>Copyright <strong>©</strong> 2009 - 2013, <a href="mailto:avkonst@users.sourceforge.net"><span class="normalImportance">Metrix++</span> Project</a></p>
- <p>Code licensed under <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GPL 3.0</a>, documentation under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
- <ul class="footer-links">
- <li><a href="#">Report defect</a></li>
- <li class="muted">·</li>
- <li><a href="#">Feature request</a></li>
- <li class="muted">·</li>
- <li><a href="#">Known issues</a></li>
- <li class="muted">·</li>
- <li><a href="#">Changelog</a></li>
- </ul>
- </div>
- </footer>
- <!-- Le javascript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
- <script src="assets/js/jquery.js"></script>
- <script src="assets/js/bootstrap-transition.js"></script>
- <script src="assets/js/bootstrap-alert.js"></script>
- <script src="assets/js/bootstrap-modal.js"></script>
- <script src="assets/js/bootstrap-dropdown.js"></script>
- <script src="assets/js/bootstrap-scrollspy.js"></script>
- <script src="assets/js/bootstrap-tab.js"></script>
- <script src="assets/js/bootstrap-tooltip.js"></script>
- <script src="assets/js/bootstrap-popover.js"></script>
- <script src="assets/js/bootstrap-button.js"></script>
- <script src="assets/js/bootstrap-collapse.js"></script>
- <script src="assets/js/bootstrap-carousel.js"></script>
- <script src="assets/js/bootstrap-typeahead.js"></script>
- <script src="assets/js/bootstrap-affix.js"></script>
- <script>
- !function ($) {
- $(function(){
- // carousel demo
- $('#myCarousel').carousel()
- })
- }(window.jQuery)
- </script>
- <script src="assets/js/holder/holder.js"></script>
- <script src="assets/js/google-code-prettify/prettify.js"></script>
- <script src="assets/js/application.js"></script>
- <script>
-
- </script>
- <!-- Analytics
- ================================================== -->
- <!--
- <script>
- var _gauges = _gauges || [];
- (function() {
- var t = document.createElement('script');
- t.type = 'text/javascript';
- t.async = true;
- t.id = 'gauges-tracker';
- t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');
- t.src = '//secure.gaug.es/track.js';
- var s = document.getElementsByTagName('script')[0];
- s.parentNode.insertBefore(t, s);
- })();
- </script>
- -->
- </body>
- </html>
|