每次计算公式时,我都会建议一些Perl开发人员反对将公式计算为字符串,而不是eval - once - 每个公式的函数。因此,不是调用eval数千次,而是调用函数。即:
而不是:
function product_to_woo( page ){
//check if page is undefined then we set it to one
if(typeof page == 'undefined'){
page = 1;
}else if( page <= 0){
//Make sure we always start to page 1
page = 1;
}
var product_number = 0;
get_product_by_page(page, function(res){
var product_count = res.products.length;
if(product_count > 0){
for( var i = 0; i < product_count; i++){
product = res.products[i];
if( product.deleted_at == null ){
product_number = i+1;
}
if(res.pagination.page > 1){
product_number += PER_PAGE;//PER_PAGE is constant value 50
}
var p_data = {
action : 'import_to_woo',
page : res.pagination.page,
product_total_count : res.pagination.results,
product : product,
product_number : product_number,
deleted_product : res.pagination.deleted_product
};
post_data(p_data,function(p_res){
//I have done some message for the users
});
}
}
if(res.pagination.page <= res.pagination.pages){
page = parseInt(res.pagination.page) + 1;
if(page <= res.pagination.pages){
product_to_woo(page);
}
}
});
}
使用:
sub calc_formulas_naive
{
my %formulas;
$formulas{formula_a} = '$ref->{metric_a} + $ref->{metric_b} * $ref->{metric_c} - 100 * $ref->{metric_c} / 1000 + 33.33 * $ref->{metric_d}';
$formulas{formula_b} = '$ref->{metric_a} * $ref->{metric_c} - 33';
$formulas{formula_c} = '$ref->{metric_a} * $ref->{metric_c} - 33 + 0.265 * ($ref->{metric_d} / $ref->{metric_c}) - $ref->{metric_a} + $ref->{metric_e} * ($ref->{metric_d} + 1)';
my $ref = shift @_;
my $form_a_val = eval $formulas{formula_a};
my $form_b_val = eval $formulas{formula_b};
my $form_c_val = eval $formulas{formula_c};
}
现在问题本身。我完全相信第二种方法在处理大量数据时具有明显的优势。我没有访问过我的旧项目,但我也很确定我看到第二种方法比第一种方法更快。毕竟,在这种情况下,Perl不必在运行中编译任何东西。
但在给出建议之前,我写了一个小的人工示例,其中5K文本文件填充了rand生成的指标,运行了两种实现,并且......我没有观察到使用未命名函数优于字符串评估的任何优势。 怎么了?当我认为eval不如函数有效时,我是否一直产生幻觉?