[DEV] optimise check of file date (3.2s->2.9s in userland and 0.60s->0.26s in kernel)

I expected more gain
This commit is contained in:
Edouard DUPIN 2017-01-31 22:44:04 +01:00
parent 791c7fe6e8
commit 3457215994
2 changed files with 38 additions and 10 deletions

View File

@ -23,6 +23,7 @@ import lutin.multiprocess as multiprocess
import lutin.tools as tools import lutin.tools as tools
import lutin.host as lutinHost import lutin.host as lutinHost
import lutin.tools as lutinTools import lutin.tools as lutinTools
import lutin.depend as depend
myArgs = arguments.LutinArg() myArgs = arguments.LutinArg()
myArgs.add("h", "help", desc="Display this help") myArgs.add("h", "help", desc="Display this help")
@ -385,6 +386,7 @@ for argument in localArgument:
} }
#remove previous target #remove previous target
my_target = None my_target = None
depend.clear_cache_file_date()
elif argument.get_option_name() == "mode": elif argument.get_option_name() == "mode":
if config["mode"] != argument.get_arg(): if config["mode"] != argument.get_arg():
config["mode"] = argument.get_arg() config["mode"] = argument.get_arg()

View File

@ -53,6 +53,32 @@ def create_dependency_file(depend_file, list_files):
_create_directory_of_file(depend_file) _create_directory_of_file(depend_file)
_file_write_data(depend_file, data) _file_write_data(depend_file, data)
# Buffer with the whole list of file check access ==> time cache of file
_list_of_file_time = {}
def clear_cache_file_date():
global _list_of_file_time
_list_of_file_time = {}
def file_get_time(file_name):
global _list_of_file_time
if file_name in _list_of_file_time:
return _list_of_file_time[file_name]
local_time = os.path.getmtime(file_name)
_list_of_file_time[file_name] = local_time
return local_time
def file_exist(file_name):
global _list_of_file_time
if file_name in _list_of_file_time:
return True
if os.path.exists(file_name) == False:
return False
# we update the date ==> permit to not do an other acces on file
local_time = os.path.getmtime(file_name)
_list_of_file_time[file_name] = local_time
return True
## ##
## @brief Check if all dependency of a file and dependency file is correct or not ## @brief Check if all dependency of a file and dependency file is correct or not
## @param[in] dst (string) File that will be generated ## @param[in] dst (string) File that will be generated
@ -78,12 +104,12 @@ def need_re_build(dst, src, depend_file=None, file_cmd="", cmd_line="", force_id
# check if the destination existed: # check if the destination existed:
if dst != "" \ if dst != "" \
and dst != None \ and dst != None \
and os.path.exists(dst) == False: and file_exist(dst) == False:
debug.extreme_verbose(" ==> must rebuild (dst does not exist)") debug.extreme_verbose(" ==> must rebuild (dst does not exist)")
return True return True
if src != "" \ if src != "" \
and src != None \ and src != None \
and os.path.exists(src) == False: and file_exist(src) == False:
debug.warning(" ==> unexistant file :'" + src + "'") debug.warning(" ==> unexistant file :'" + src + "'")
return True return True
# Check the basic date if the 2 files # Check the basic date if the 2 files
@ -91,19 +117,19 @@ def need_re_build(dst, src, depend_file=None, file_cmd="", cmd_line="", force_id
and dst != None \ and dst != None \
and src != "" \ and src != "" \
and src != None \ and src != None \
and os.path.getmtime(src) > os.path.getmtime(dst): and file_get_time(src) > file_get_time(dst):
debug.extreme_verbose(" ==> must rebuild (source time greater)") debug.extreme_verbose(" ==> must rebuild (source time greater)")
return True return True
if depend_file != "" \ if depend_file != "" \
and depend_file != None \ and depend_file != None \
and os.path.exists(depend_file) == False: and file_exist(depend_file) == False:
debug.extreme_verbose(" ==> must rebuild (no depending file)") debug.extreme_verbose(" ==> must rebuild (no depending file)")
return True return True
if file_cmd != "" \ if file_cmd != "" \
and file_cmd != None: and file_cmd != None:
if os.path.exists(file_cmd) == False: if file_exist(file_cmd) == False:
debug.extreme_verbose(" ==> must rebuild (no commandLine file)") debug.extreme_verbose(" ==> must rebuild (no commandLine file)")
return True return True
# check if the 2 cmd_line are similar : # check if the 2 cmd_line are similar :
@ -145,11 +171,11 @@ def need_re_build(dst, src, depend_file=None, file_cmd="", cmd_line="", force_id
# really check files: # really check files:
if test_file != "": if test_file != "":
debug.extreme_verbose(" ==> test"); debug.extreme_verbose(" ==> test");
if False==os.path.exists(test_file): if file_exist(test_file) == False:
debug.extreme_verbose(" ==> must rebuild (a dependency file does not exist)") debug.extreme_verbose(" ==> must rebuild (a dependency file does not exist)")
file.close() file.close()
return True return True
if os.path.getmtime(test_file) > os.path.getmtime(dst): if file_get_time(test_file) > file_get_time(dst):
debug.extreme_verbose(" ==> must rebuild (a dependency file time is newer)") debug.extreme_verbose(" ==> must rebuild (a dependency file time is newer)")
file.close() file.close()
return True return True
@ -210,7 +236,7 @@ def need_re_package(dst, src_list, must_have_src, file_cmd="", cmd_line=""):
return True return True
# check if the destination existed: # check if the destination existed:
if os.path.exists(dst) == False: if file_exist(dst) == False:
debug.extreme_verbose(" ==> must re-package (dst does not exist)") debug.extreme_verbose(" ==> must re-package (dst does not exist)")
return True return True
# chek the basic date if the 2 files # chek the basic date if the 2 files
@ -218,12 +244,12 @@ def need_re_package(dst, src_list, must_have_src, file_cmd="", cmd_line=""):
debug.extreme_verbose(" ==> must re-package (no source ???)") debug.extreme_verbose(" ==> must re-package (no source ???)")
return True return True
for src in compleate_list: for src in compleate_list:
if os.path.getmtime(src) > os.path.getmtime(dst): if file_get_time(src) > file_get_time(dst):
debug.extreme_verbose(" ==> must re-package (source time greater) : '" + src + "'") debug.extreme_verbose(" ==> must re-package (source time greater) : '" + src + "'")
return True return True
if ""!=file_cmd: if ""!=file_cmd:
if False==os.path.exists(file_cmd): if False==file_exist(file_cmd):
debug.extreme_verbose(" ==> must rebuild (no commandLine file)") debug.extreme_verbose(" ==> must rebuild (no commandLine file)")
return True return True
# check if the 2 cmd_line are similar : # check if the 2 cmd_line are similar :