- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我看到其他线程说 java 反射性能比使用非反射调用时慢 10-100 倍。
我在 1.6 中的测试表明情况并非如此,但我发现了一些其他有趣的事情,我需要有人向我解释。
我有实现我的接口(interface)的对象。我做了三件事 1) 使用对对象的引用我将该对象转换为接口(interface)并通过接口(interface)调用方法 2) 使用对实际对象的引用直接调用方法 3) 通过反射调用方法。我看到 #1 接口(interface)调用最快,紧随其后的是 #3 反射,但我注意到直接方法调用是最慢的。
我不明白,我希望直接调用最快,然后是接口(interface),然后反射会慢得多。
Blah 和 ComplexClass 与主类位于不同的包中,并且都有一个 doSomething(int x) 方法来实现接口(interface)并只打印整数 x。
这是我的结果(时间以毫秒为单位,多次试验的结果非常相似):直接调用方法:107194直接从转换为接口(interface)的对象调用方法:89594通过反射调用方法:90453
这是我的代码:
public class Main
{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
Blah x = new Blah();
ComplexClass cc = new ComplexClass();
test((Object) x, cc);
}
public static void test(Object x, ComplexClass cc)
{
long start, end;
long time1, time2, time3 = 0;
int numToDo = 1000000;
MyInterface interfaceClass = (MyInterface) x;
//warming up the cache
for (int i = 0; i < numToDo; i++)
{
cc.doSomething(i); //calls a method directly
}
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
cc.doSomething(i); //calls a method directly
}
end = System.currentTimeMillis();
time1 = end - start;
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
interfaceClass.doSomething(i); //casts an object to an interface then calls the method
}
end = System.currentTimeMillis();
time2 = end - start;
try
{
Class xClass = x.getClass();
Class[] argTypes =
{
int.class
};
Method m = xClass.getMethod("doSomething", argTypes);
Object[] paramList = new Object[1];
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
paramList[0] = i;
m.invoke(x, paramList); //calls via reflection
}
end = System.currentTimeMillis();
time3 = end - start;
} catch (Exception ex)
{
}
System.out.println("calling a method directly: " + time1);
System.out.println("calling a method directly from an object cast to an interface: " + time2);
System.out.println("calling a method through reflection: " + time3);
}
最佳答案
将所有测试放在同一个程序中是一个微基准测试错误 - Java 性能有一定的预热。这是最重要的失败。
将您的测试放在单独的程序中。然后多次运行测试,以便您了解预热何时完成以及统计显着性。
还有一个包含内部循环的巨大方法。 Hotspot 似乎比以前更擅长处理这个问题,但它仍然不够好。
您应该会发现,使用 -server
在紧密循环中调用虚方法(即使由不同的类加载器加载)会得到完全优化。因此,说直接调用比反射调用快多少没有多大意义。
关于java - 解读Java反射性能: Why is it surprisingly very fast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122506/
阅读 slides about constexpr 时介绍是关于“令人惊讶的 consts 动态初始化”。例子是 struct S { static const int c; }; const
我试图理解 rdpmc 指令。因此,我有以下 asm 代码: segment .text global _start _start: xor eax, eax mov ebx, 10
我正在使用 Python 模块 telnetlib 创建一个 telnet session (与国际象棋服务器),我遇到了一个我真的无法解决的问题。以下代码完美运行: >>> f = login("m
我看到其他线程说 java 反射性能比使用非反射调用时慢 10-100 倍。 我在 1.6 中的测试表明情况并非如此,但我发现了一些其他有趣的事情,我需要有人向我解释。 我有实现我的接口(interf
// Python 的“整数除法”运算符今天让我感到惊讶: >>> math.floor(11/1.1) 10.0 >>> 11//1.1 9.0 documentation读作“x 和 y 的(取整
我已经在 Windows10 中安装了 scikit-surprise。 C:\Users\Cosmos Lord>pip install scikit-surprise Requirement al
我在安装惊喜包时使用以下命令。我在安装时收到错误消息,我无法理解。我需要帮助才能成功安装此软件包。 pip 安装 scikit-surprise 最后一个错误代码表示需要 Microsoft Visu
我想使用 Surprise 构建一个简单的书籍推荐器图书馆和购买/不购买作为评级值(而不是经典的 1 到 5)。 我的问题是我想在我的 whole dataset 上训练所以我可以得到对 ALL us
我无法理解 Surprise 的工作流程。我有一个用于训练的文件(我试图将其分为训练和验证)和一个用于测试数据的文件。我无法理解 Surprise Dataset 和 Trainset 之间的区别 #
我正在尝试移动一个 body : if (ks.IsKeyDown(Keys.Up)) { rocket.ApplyImpulse(new Box2DX.Common.Vec2(0, 30f)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已经尝试使用以下命令安装SCRIPKIT-SECHING。但是当在我的jupyter笔记本上运行导入时,。我得到以下错误。我目前在Windows 10上使用的是Python 3.11.4,并多次尝试
考虑以下两个 Python 代码示例,它们实现相同但具有显着且令人惊讶的性能差异。 import psycopg2, time conn = psycopg2.connect("dbname=myda
您好,我安装了 surprise 包,它在 import 时出错(第 3 节中的 errr msg) 在 conda cmd 中,我安装了 surprise,后来又重新安装了 scipy,因为它在错误
我正在学习协作学习算法和sklearnsurprise库,但我很好奇.predict函数中这个参数有什么用。 文档指出: We can now predict ratings by directly
我正在学习协作学习算法和sklearnsurprise库,但我很好奇.predict函数中这个参数有什么用。 文档指出: We can now predict ratings by directly
在我的代码中,我做了如下操作: 查询类(class)实体 用给定的类(class)数据填充它。 courseDao.update(entity) 内部调用 persist(entity) 方法。 令人
from surprise import Reader, Dataset, SVD from surprise import evaluate ----------------------------
场景 要导入的数据集包含大量 NaN 值。同样,我在 Python 中使用 SurPRISE 包(由 Nicholas Hug 编写),而不是使用 Pandas。原因是预测 NaN 值的方法与提到的包
我引用最近的Google JavaScript Style Guide : Do not use JavaScript getter and setter properties. They are p
我是一名优秀的程序员,十分优秀!