Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有元语言抽象的语言是否比仅使用反射API的语言性能更好?_C#_Java_Reflection_Lisp_Eval - Fatal编程技术网

C# 具有元语言抽象的语言是否比仅使用反射API的语言性能更好?

C# 具有元语言抽象的语言是否比仅使用反射API的语言性能更好?,c#,java,reflection,lisp,eval,C#,Java,Reflection,Lisp,Eval,比如说,如果我有一个Lisp程序,它使用(eval'sym),并在其符号表中查找它,那么它是否真的比“静态”语言中的aClass.getField(“sym”,一个station)之类的东西性能更好呢?这取决于语言的实现 例如aClass.getField(“sym”,一个状态)不应该与eval完全相同,这是绝对没有理由的 另一方面,即使在实际实现中,速度也有很大不同。例如,在.Net中,有慢反射方法和快反射方法(通常快100倍或更多)。你需要哪一个在很大程度上取决于你实际想用这个方法做什么。是

比如说,如果我有一个Lisp程序,它使用
(eval'sym)
,并在其符号表中查找它,那么它是否真的比“静态”语言中的
aClass.getField(“sym”,一个station)
之类的东西性能更好呢?

这取决于语言的实现

例如aClass.getField(“sym”,一个状态)不应该与eval完全相同,这是绝对没有理由的


另一方面,即使在实际实现中,速度也有很大不同。例如,在.Net中,有慢反射方法和快反射方法(通常快100倍或更多)。你需要哪一个在很大程度上取决于你实际想用这个方法做什么。是否只读取一个值?改变一个值?安全相关吗?

这个问题提出得不好,部分原因是这两种方法并不相互排斥

例如,CommonLisp提供了
EVAL

Common Lisp还提供了许多反射功能,允许您查看包中的符号,按名称查找(全局)变量的值,按名称构造类实例,查找或设置类中插槽的值,或根据其名称调用函数。通过广泛实现(尽管不是ANSI标准)的CLOS元对象协议,您可以根据类和泛型函数的名称找到更多关于它们的信息

当然,比较语言而不是实现性能的问题仍然存在。自然地,编译成本机代码的公共Lisp的性能将与正在解释的公共Lisp有很大的不同,大多数CL实现允许您混合编译和解释代码(尽管少数只提供编译器)。

<(模数实现问题,如字节码与本机代码或代码生成质量),具有元语言抽象的语言提供了更强大的能力来创建程序,这些程序的性能优于在可比的时间范围内创建的程序,而这些程序可以与缺乏这种抽象的语言进行比较。情况是,当您为自己的语言编写实现时,您有更多的信息来进行比编译器更强大的优化因为基础语言可以做到。实践中有很多这样的例子

此外,您似乎将反射(作为“开放实现”的一种特殊情况)和元语言抽象混为一谈。元语言抽象是在基础语言之上构建新语言,而反射(或“开放实现”)是将程序的内部内容暴露给程序本身

在您的特定示例中(当然,模块实现问题,如字节码与本机代码或代码生成质量),
(eval'sym)
可能更快。原因是
“sum
是一个符号对象,而不是字符串。评估符号意味着获取其值单元格。因此eval只需做几件事:

  • 对象类型上的分派(在本例中为符号)(例如,通过使用值标记遍历跳转表)
  • 提取符号的值(通过取消引用符号结构)
  • 但Java示例还有很多事情要做:

  • 查找给定名称的字段。这需要计算字符串的哈希值并使用哈希表
  • 提取字段的值(通过在特定于字段的偏移量处取消引用实例指针)
  • 框中输入值(如果不是引用)

  • 特别昂贵的部分是计算散列并遍历散列表。

    我无法想象你能从语言风格之间的总体性能差异中挑出这一特定功能的性能差异。你想知道“语言运行得更快”吗或者你对功能感兴趣?“性能更好”是相当含糊的。当然,速度方面的性能。你无法比较语言性能,但它们的实际实现(编译器/解释器)。@fortran:不确定..有两种方法明确说明:1)内置语言内省。2) 反射API。=|我不知道这些问题这是aClass.getField可能较慢的原因-它必须从名称(字符串)中提取字段元对象。