cgen: support `-profile -` and `-profile x.txt`

pull/4587/head
Delyan Angelov 2020-04-25 13:41:49 +03:00
parent eecf92cdb0
commit 4bcdf11743
4 changed files with 22 additions and 3 deletions

View File

@ -65,8 +65,15 @@ The build flags are shared by the build and run commands:
-prod
Compile the executable in production mode where most optimizations are enabled.
-prof, -profile
-prof, -profile <file.txt>
Compile the executable with all functions profiled.
The profile results will be stored in `file.txt`.
The format is 4 fields, separated by a space, for each v function:
a) how many times it was called
b) how much *nanoseconds in total* it took
c) an average for each function (i.e. (b) / (a) )
d) the function name
NB: if you want to output the profile info to stdout, use `-profile -`.
-stats
Enable more detailed statistics reporting, while compiling test files.

View File

@ -146,7 +146,9 @@ fn parse_args(args []string) (&pref.Preferences, string) {
res.is_bare = true
}
'-prof', '-profile' {
res.profile_file = cmdline.option(current_args, '-profile', '-')
res.is_prof = true
i++
}
'-prod' {
res.is_prod = true

View File

@ -141,9 +141,18 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl) {
if is_main {
if g.pref.is_prof {
g.pcs_declarations.writeln('void vprint_profile_stats(){')
if g.pref.profile_file == '-' {
for pfn_name, pcounter_name in g.pcs {
g.pcs_declarations.writeln('\tif (${pcounter_name}_calls) printf("%llu %f %f ${pfn_name} \\n", ${pcounter_name}_calls, $pcounter_name, $pcounter_name / ${pcounter_name}_calls );')
}
}else{
g.pcs_declarations.writeln('\tFILE * fp;')
g.pcs_declarations.writeln('\tfp = fopen ("${g.pref.profile_file}", "w+");')
for pfn_name, pcounter_name in g.pcs {
g.pcs_declarations.writeln('\tif (${pcounter_name}_calls) fprintf(fp, "%llu %f %f ${pfn_name} \\n", ${pcounter_name}_calls, $pcounter_name, $pcounter_name / ${pcounter_name}_calls );')
}
g.pcs_declarations.writeln('\tfclose(fp);')
}
g.pcs_declarations.writeln('}')
}
g.writeln('\treturn 0;')

View File

@ -31,6 +31,7 @@ pub mut:
is_live bool // main program that contains live/hot code
is_shared bool // an ordinary shared library, -shared, no matter if it is live or not
is_prof bool // benchmark every function
profile_file string // the profile results will be stored inside profile_file
translated bool // `v translate doom.v` are we running V code translated from C? allow globals, ++ expressions, etc
is_prod bool // use "-O2"
obfuscate bool // `v -obf program.v`, renames functions to "f_XXX"