我想知道Ruby中点和运算符表示法之间的区别。以下是一些例子
public class dBConnect
{
//create SQLconnection variable
private SqlConnection con;
//create default constructor that passing a string to con
public dBConnect()
{
try
{
con = new SqlConnection(@"Server=Trump\SQLEXPRESS;
Database=Demo;User Id=sa;Password = stevejobs;");
}
catch(Exception exCon)
{
Console.WriteLine("Unable to connect to database: {0}", exCon);
}
}
//create Select method to Pour the data into the DataTable
public DataTable SelectAll(string procName, SqlParameter[] para = null)
{
//create a DataTable to store Data from DB
DataTable dt = new DataTable();
//create SQLCommand
SqlCommand cmd = new SqlCommand(procName, con);
//declare that cmdType is sp
cmd.CommandType = CommandType.StoredProcedure;
//input parameter of cmd
if (para != null)
cmd.Parameters.AddRange(para);
//create dataAdapter object
//InvalidOperationException was thrown at here
SqlDataAdapter da = new SqlDataAdapter(cmd);
//declare that cmd is select command of da
da.SelectCommand = cmd;
//use try/catch/finally to establish a connection
try
{
con.Open();
da.Fill(dt);
}
catch(Exception sqlEx)
{
Console.WriteLine(@":Unable to establish a connection: {0}", sqlEx);
}
finally
{
con.Close();
con.Dispose();
}
return dt;
}
}
由于两者都调用一个方法并返回类似的对象,我怀疑点符号或运算符方法更有效。任何想法都表示赞赏。
答案 0 :(得分:4)
[...]如果我们使用该点
.
表示法调用对象上的方法,那么2 + 3 * 4
中的点在哪里?诀窍是:Ruby默默地为你添加它们。如果您编写以下代码:
number = 2 + 3 * 4
然后Ruby会将此转换为以下内容:
number = 2.+(3.*(4))
至于性能差异:
# bmbm_dot_vs_operators.rb
require "benchmark"
Benchmark.bmbm do |x|
x.report("dots") { 2.+(3.*(4)) }
x.report("operators") { 2 + 3 * 4 }
x.report("operators") { 4 + 2 * 3 }
x.report("dots") { 4.+(2.*(3)) }
end
在我的系统上运行时(MacBook Pro(Retina,15英寸,2013年末)),它会产生以下结果
$ ruby bmbm_dot_vs_operators.rb
Rehearsal ---------------------------------------------
dots 0.000000 0.000000 0.000000 ( 0.000005)
operators 0.000000 0.000000 0.000000 ( 0.000002)
operators 0.000000 0.000000 0.000000 ( 0.000002)
dots 0.000000 0.000000 0.000000 ( 0.000002)
------------------------------------ total: 0.000000sec
user system total real
dots 0.000000 0.000000 0.000000 ( 0.000002)
operators 0.000000 0.000000 0.000000 ( 0.000002)
operators 0.000000 0.000000 0.000000 ( 0.000002)
dots 0.000000 0.000000 0.000000 ( 0.000002)
结果尚无定论。
当使用内联运算符而不是点等式方法时,性能几乎没有可测量的差异。
此外,第一个操作始终是最慢的,因此为了比较基准测试顺序,它被多次包括在内。
<强>参考文献:强>
答案 1 :(得分:0)
tl; dr:运算符表示法是用于点表示法的语法糖。我不希望任何明显的性能差异。
如果你看Ruby's grammar,你会发现以下内容:
call_bin_op(recv,id,arg1) call_bin_op_gen(parser, (recv),(id),(arg1))
这基本上说你的例子中的+
这样的二元运算符有一个接收者,一个ID(把它想象为符号的CRuby)和一个参数,就像一个带有一个参数的方法调用一样。
如果您再看call_bin_op_gen
,就会发现它实际上转化为通话:
static NODE *
call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1)
{
value_expr(recv);
value_expr(arg1);
return NEW_CALL(recv, id, NEW_LIST(arg1));
}