Skip to content

Instantly share code, notes, and snippets.

@mauro3
Created June 22, 2017 08:20
Show Gist options
  • Save mauro3/f6b665ce5ab973367cfcde894bd94f71 to your computer and use it in GitHub Desktop.
Save mauro3/f6b665ce5ab973367cfcde894bd94f71 to your computer and use it in GitHub Desktop.
SnoopCompile.jl for ArgParse.jl
using ArgParse
s = ArgParseSettings()
@add_arg_table s begin # this takes 1.5s!
"--areamin", "-n"
help = "Minimum area (km^2)"
default = 0.0
arg_type = Float64
"--areamax", "-x"
help = "Maximum area (km^2)"
default = Inf
arg_type = Float64
"--dist", "-d"
help = "Maximal search distance (default 10km)"
default = 10.0
arg_type = Float64
"--proj", "-p"
help = "Projection of (x,y) in Proj4 format. Default long-lat"
default = "+proj=longlat"
arg_type = String
"--utm", "-u"
help = "UTM projection zone of (x,y): 32N or 24S (north/south)"
default = ""
arg_type = String
"x-coord"
help = "X coordinate or longitude"
required = true
arg_type = Float64
"y-coord"
help = "Y coordinate or latitude"
arg_type = Float64
required = true
end
# # Expands to:
# (ArgParse.isa)(s,ArgParse.ArgParseSettings) || (ArgParse.error)("first argument to @add_arg_table must be of type ArgParseSettings")
# (ArgParse.add_arg_field)(s,["--areamin";"-n"]; (ArgParse.Dict)(:help => "Minimum area (km^2)",:default => 0.0,:arg_type => Float64)...)
# (ArgParse.add_arg_field)(s,["--areamax";"-x"]; (ArgParse.Dict)(:help => "Maximum area (km^2)",:default => Inf,:arg_type => Float64)...)
# (ArgParse.add_arg_field)(s,["--dist";"-d"]; (ArgParse.Dict)(:help => "Maximal search distance (default 10km)",:default => 10.0,:arg_type => Float64)...)
# (ArgParse.add_arg_field)(s,["--proj";"-p"]; (ArgParse.Dict)(:help => "Projection of (x,y) in Proj4 format. Default long-lat",:default => "+proj=longlat",:arg_type => String)...)
# (ArgParse.add_arg_field)(s,["--utm";"-u"]; (ArgParse.Dict)(:help => "UTM projection zone of (x,y): 32N or 24S (north/south)",:default => "",:arg_type => String)...)
# (ArgParse.add_arg_field)(s,"x-coord"; (ArgParse.Dict)(:help => "X coordinate or longitude",:required => true,:arg_type => Float64)...)
# (ArgParse.add_arg_field)(s,"y-coord"; (ArgParse.Dict)(:help => "Y coordinate or latitude",:arg_type => Float64,:required => true)...)
ARGS = String["-d","5","-u","45n","-n","1","483516","4773140"]
args = parse_args(ARGS, s)
print("done")
using SnoopCompile
### Log the compiles
# This only needs to be run once (to generate "/tmp/images_compiles.csv")
SnoopCompile.@snoop "/tmp/argparse_compiles.csv" begin
include("snoop-include.jl")
end ######
### Parse the compiles and generate precompilation scripts
# This can be run repeatedly to tweak the scripts
# IMPORTANT: we must have the module(s) defined for the parcelation
# step, otherwise we will get no precompiles for the Images module
using ArgParse
data = SnoopCompile.read("/tmp/argparse_compiles.csv")
# Use these two lines if you want to create usrimg.jl
pc = SnoopCompile.format_userimg(data[end:-1:1,2])
SnoopCompile.write("/tmp/userimg_argparse.jl", pc)
# to make ArgParse faster for a specific script
precompile(Base.rehash!, (Base.Dict{AbstractString, Void}, Int64,))
precompile(Base.deepcopy_internal, (Array{String, 1}, Base.ObjectIdDict,))
precompile(Base.replace, (String, Char, Char, Int64,))
precompile(Base.schedule_and_wait, (Task, Void,))
precompile(Base._setindex!, (Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64,))
precompile(Base._setindex!, (Base.Dict{Symbol, Any}, Symbol, Symbol, Int64,))
precompile(Base.Type, (Type{Base.Set{AbstractString}},))
precompile(Base.vect, (Symbol,))
precompile(Base.vect, (String,))
precompile(Base.string, (String, String,))
precompile(ArgParse.check_arg_name, (String,))
precompile(Base.ht_keyindex, (Base.Dict{String, Any}, String,))
precompile(ArgParse.parse1_optarg, (ArgParse.ParserState, ArgParse.ArgParseSettings, ArgParse.ArgParseField, Void, String,))
precompile(Base.ht_keyindex, (Base.Dict{AbstractString, Void}, String,))
precompile(Base.pop!, (Array{ArgParse.ArgParseField, 1},))
precompile(Base.rehash!, (Base.Dict{String, Any}, Int64,))
precompile(Base.rehash!, (Base.Dict{Symbol, Bool}, Int64,))
precompile(Base.skip_deleted, (Base.Dict{AbstractString, Any}, Int64,))
precompile(Base.vector_any, (Any,))
precompile(ArgParse.check_name_format, (Array{String, 1},))
precompile(ArgParse.check_conflicts_with_commands, (ArgParse.ArgParseSettings, ArgParse.ArgParseField, Bool,))
precompile(ArgParse.check_name_format, (String,))
precompile(Base.skip_deleted, (Base.Dict{Symbol, Bool}, Int64,))
precompile(ArgParse.check_for_duplicates, (Array{ArgParse.ArgParseField, 1}, ArgParse.ArgParseField,))
precompile(Base.produce, (Symbol,))
precompile(Base.task_done_hook, (Task,))
precompile(Base.Type, (Type{Base.Dict{Symbol, Any}}, Tuple{Base.Pair{Symbol, String}, Base.Pair{Symbol, String}, Base.Pair{Symbol, DataType}},))
precompile(Base.Type, (Type{Base.Dict{Symbol, Any}}, Tuple{Base.Pair{Symbol, String}, Base.Pair{Symbol, Float64}, Base.Pair{Symbol, DataType}},))
precompile(Base.Type, (Type{Base.Dict{Symbol, Any}}, Tuple{Base.Pair{Symbol, String}, Base.Pair{Symbol, Bool}, Base.Pair{Symbol, DataType}},))
precompile(ArgParse.looks_like_an_option, (String, ArgParse.ArgParseSettings,))
precompile(Base.skip_deleted, (Base.Dict{String, Any}, Int64,))
precompile(Base.Type, (Type{Base.Dict{Symbol, Any}}, Tuple{Base.Pair{Symbol, String}, Base.Pair{Symbol, DataType}, Base.Pair{Symbol, Bool}},))
precompile(ArgParse.is_flag, (ArgParse.ArgParseField,))
precompile(ArgParse.check_nargs_and_action, (ArgParse.ArgConsumerType, Symbol,))
precompile(Base._setindex!, (Base.Dict{Symbol, Any}, Float64, Symbol, Int64,))
precompile(ArgParse.parse1_flag, (ArgParse.ParserState, ArgParse.ArgParseSettings, ArgParse.ArgParseField, Bool, String,))
precompile(Base.UTF8proc.isalnum, (Char,))
precompile(Base._setindex!, (Base.Dict{String, Any}, Void, String, Int64,))
precompile(ArgParse.idstring, (ArgParse.ArgParseField,))
precompile(ArgParse.Type, (Type{ArgParse.ArgParseField},))
precompile(Base._setindex!, (Base.Dict{String, Any}, String, String, Int64,))
precompile(ArgParse.preparse, (Base.Channel{Any}, ArgParse.ParserState, ArgParse.ArgParseSettings,))
precompile(Base.splice!, (Array{Any, 1}, Int64, Array{Any, 1},))
precompile(ArgParse.check_short_opt_name, (String, ArgParse.ArgParseSettings,))
precompile(ArgParse.is_arg, (ArgParse.ArgParseField,))
precompile(Base.getindex, (Type{String}, String, String, String, String,))
precompile(Base._setindex!, (Base.Dict{String, Any}, Float64, String, Int64,))
precompile(Base.vcat, (String, String,))
precompile(ArgParse.parse_command_args, (ArgParse.ParserState, ArgParse.ArgParseSettings,))
precompile(Base.copy!, (Array{Symbol, 1}, Int64, Array{Symbol, 1}, Int64, Int64,))
precompile(ArgParse.read_args_from_files, (Array{String, 1}, Base.Set{Char},))
precompile(Base.deepcopy_internal, (Array{UInt8, 1}, Base.ObjectIdDict,))
precompile(ArgParse.auto_dest_name, (String, Array{AbstractString, 1}, Array{AbstractString, 1}, Bool,))
precompile(Base.schedule_and_wait, (Task, Symbol,))
precompile(Base.Type, (Type{Base.Dict{Symbol, Any}}, Array{Any, 1},))
precompile(Base._setindex!, (Base.Dict{AbstractString, Void}, Void, String, Int64,))
precompile(ArgParse.check_metavar, (String,))
precompile(Base.indexed_next, (Base.Pair{Symbol, Float64}, Int64, Int64,))
precompile(ArgParse.check_settings_can_use_symbols, (ArgParse.ArgParseSettings,))
precompile(Base._setindex!, (Base.Dict{Symbol, Bool}, Bool, Symbol, Int64,))
precompile(ArgParse.parse_arg, (ArgParse.ParserState, ArgParse.ArgParseSettings,))
precompile(ArgParse.is_multi_nargs, (ArgParse.ArgConsumerType,))
precompile(Base.setindex!, (Base.Dict{Symbol, Any}, Symbol, Symbol,))
precompile(ArgParse.parse_args_unhandled, (Array{String, 1}, ArgParse.ArgParseSettings, Bool,))
precompile(ArgParse.convert_to_symbols, (Base.Dict{String, Any},))
precompile(ArgParse.found_command, (ArgParse.ParserState,))
precompile(Base.push!, (Array{ArgParse.ArgParseField, 1}, ArgParse.ArgParseField,))
precompile(ArgParse.Type, (Type{ArgParse.ArgParseSettings},))
precompile(ArgParse.auto_metavar, (String, Bool,))
precompile(ArgParse.check_long_opt_name, (String, ArgParse.ArgParseSettings,))
precompile(ArgParse.is_flag_action, (Symbol,))
precompile(ArgParse.default_action, (ArgParse.ArgConsumerType,))
precompile(ArgParse.check_dest_name, (String,))
precompile(ArgParse.has_cmd, (ArgParse.ArgParseSettings,))
precompile(ArgParse.is_command_action, (Symbol,))
precompile(ArgParse.Type, (Type{ArgParse.ArgParseTable},))
precompile(ArgParse.Type, (Type{ArgParse.ParserState}, Array{String, 1}, ArgParse.ArgParseSettings, Bool,))
precompile(ArgParse.parse_short_opt, (ArgParse.ParserState, ArgParse.ArgParseSettings,))
precompile(ArgParse.is_multi_action, (Symbol,))
precompile(Base.indexed_next, (Base.Pair{Symbol, DataType}, Int64, Int64,))
precompile(ArgParse.get_group, (String, ArgParse.ArgParseField, ArgParse.ArgParseSettings,))
precompile(ArgParse.name_to_fieldnames, (Array{String, 1}, ArgParse.ArgParseSettings,))
precompile(ArgParse.parse_args, (Array{String, 1}, ArgParse.ArgParseSettings,))
precompile(ArgParse.parse_item, (Type{Float64}, String,))
precompile(Base.indexed_next, (Base.Pair{Symbol, Bool}, Int64, Int64,))
precompile(ArgParse.check_prefix_chars, (Base.Set{Char},))
precompile(Base.indexed_next, (Tuple{Symbol, Float64}, Int64, Int64,))
precompile(ArgParse.check_arg_makes_sense, (ArgParse.ArgParseSettings, ArgParse.ArgParseField,))
precompile(Base.convert, (Type{Union{AbstractString, Void}}, String,))
precompile(Base.convert, (Type{ArgParse.ArgConsumerType}, ArgParse.ArgConsumerType,))
precompile(ArgParse.test_required_args, (ArgParse.ArgParseSettings, Base.Set{AbstractString},))
precompile(Base.convert, (Type{Union{AbstractString, Void}}, Void,))
precompile(ArgParse.parse_long_opt, (ArgParse.ParserState, ArgParse.ArgParseSettings,))
precompile(ArgParse.Type, (Type{ArgParse.ArgConsumerType}, Symbol,))
precompile(ArgParse.parse_item, (Type{String}, String,))
precompile(ArgParse.name_to_fieldnames, (String, ArgParse.ArgParseSettings,))
precompile(Base.ht_keyindex2, (Base.Dict{String, Any}, String,))
precompile(Base.ht_keyindex2, (Base.Dict{AbstractString, Void}, String,))
precompile(Base.ht_keyindex2, (Base.Dict{Symbol, Bool}, Symbol,))
precompile(ArgParse.check_action_is_valid, (Symbol,))
precompile(ArgParse.warn_extra_opts, (Array{Symbol, 1}, Array{Symbol, 1},))
precompile(Base.setindex!, (Base.Dict{String, Any}, String, String,))
precompile(Base.setindex!, (Base.Dict{Symbol, Any}, Float64, Symbol,))
precompile(Base.consume, (Task,))
precompile(Base.setindex!, (Base.Dict{String, Any}, Void, String,))
precompile(Base.setindex!, (Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol,))
precompile(Base.setindex!, (Base.Dict{String, Any}, Float64, String,))
precompile(Base.setindex!, (Base.Dict{Symbol, Any}, Symbol, Symbol,))
precompile(Base.setindex!, (Base.Dict{AbstractString, Void}, Void, String,))
precompile(Base.append!, (Array{Symbol, 1}, Array{Symbol, 1},))
precompile(Base.setindex!, (Base.Dict{Symbol, Bool}, Bool, Symbol,))
precompile(Base.Type, (Type{Base.Dict{Symbol, Bool}}, Array{Tuple{Symbol, Bool}, 1},))
precompile(ArgParse.get_group_name, (String, ArgParse.ArgParseField, ArgParse.ArgParseSettings,))
@mauro3
Copy link
Author

mauro3 commented Jun 22, 2017

Does not help much. The slow part is https://gist.github.com/mauro3/f6b665ce5ab973367cfcde894bd94f71#file-snoop-include-jl-L4, but it only speeds this up from 1.5s to 1.35s. Also line 46 is not sped up.

Note snoop.jl errors here https://gist.github.com/mauro3/f6b665ce5ab973367cfcde894bd94f71#file-snoop-jl-L17. I just deleted the offending part of the "/tmp/argparse_compiles.csv" file. It could well be that that would be the part which would speed things up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment