eval算术表达式作为字符串与调用函数

时间:2016-08-07 14:59:58

标签: performance perl eval

每次计算公式时,我都会建议一些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不如函数有效时,我是否一直产生幻觉?

0 个答案:

没有答案