我正在考虑在我的软件中添加一些可选的日志代码。我希望大部分时间都会被禁用,所以我对快速路径非常感兴趣。
首先编写它,然后优化的常用方法在这种情况下并不理想,因为代码的目的是使日志记录足够便宜,使用我的软件的开发人员愿意将它放入用户的某些紧密循环中不妨在发布后探索。因此,我首先花一些时间进行优化实际上是有意义的。
我一直在使用timeit模块来确定最佳前进路径。我发现最优化的方法是使用带有标志的局部变量来指示是否运行代码。代码如下:
flag = logger.shouldLog # loookup the variable once
while True:
... do some operations in a tight loop
if flag:
logger.log(x, y, z)
我将此称为我的参考时间,因此它会在1.0时间内执行。
问题1:是否有更快的方式来进行条件记录,而不是编写两个函数,一个记录一个没有?
我看过的替代方案涉及查找变量,例如
while True:
... do some operations
if logger.shouldLog:
logger.log(x, y, z)
哪个在大约32.5的时间内运行....因为查找而慢得多
我还看了一下函数调用有多糟糕:
while True:
... do some operations
if logger.shouldLog(): # simply returns False in my test case
logger.log(x, y, z)
这次运行时间为135次,比简单的查找速度慢约4倍
问题2:有没有办法加快我在这里的查询速度,以便为用户提供更多选择?
我希望拥有更多的粒度,以便那些只想要快速和肮脏的日志记录解决方案的用户可以像我展示的后两种情况一样轻松地编写一些东西(或者甚至更慢,只需要一个nullImpotent .log函数快速路径),但对于性能重要的代码的关键部分,我希望能够在第一个案例和第二个案例之间的某个速度执行某些事情。
答案 0 :(得分:0)
使用 ChoiceBox<String> colorChoice = new ChoiceBox<>(
FXCollections.observableArrayList("Red", "Blue", "Green", "Yellow", "Pink", "Grey", "Black", "White"));
colorChoice.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
String choice = colorChoice.getSelectionModel().getSelectedItem() ;
if (choice != null) {
String color = choice.toLowerCase();
colorChoice.setStyle("-fx-base: "+color+"; -fx-control-inner-background: -fx-base ;");
text.setFill(Color.web(color));
}
}
});
变量并在记录不重要时优化python执行:
__debug__
如果您将此脚本作为def log(x, y):
print(x, y)
def doit():
a = range(100)
sum_ = 0
for item1 in a:
for item2 in a:
if __debug__:
log(item1, item2)
sum_ += item1 + item2
return sum_
if __name__ == '__main__':
doit()
运行,那么它python testscript.py
所有这些东西。如果您将其称为prints
,则它不会打印任何内容,因为-O
会删除所有python -O testscripy.py
部分。
时序:
__debug__
如果我从文件中删除$ python -O -m timeit "from testscript1 import doit" "doit()"
100 loops, best of 3: 2.6 msec per loop
,则其时间为:
if __debug__: log(item1, item2)
如果我用一些自定义变量替换$ python -O -m timeit "from testscript2 import doit" "doit()"
100 loops, best of 3: 2.61 msec per loop
,这肯定会慢一些:
__debug__