首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用ASM检测后,同步数据块需要更多时间

使用ASM检测后,同步数据块需要更多时间
EN

Stack Overflow用户
提问于 2013-11-25 12:49:00
回答 1查看 360关注 0票数 2

我正在尝试使用ASM检测java同步块。问题是在检测之后,同步块的执行时间需要更多的时间。在Linux机器上,它从2毫秒增加到200毫秒。

我通过识别MonitorEnter和MonitorExit操作码来实现这一点。

我试着在三个层次上进行测试: 1.在MonitorEnter之前2.在MonitorEnter之后3.在MonitorExit之前。1和3一起工作很好,但当我使用2时,执行时间会急剧增加。

即使我们检测另一条SOP语句,这条语句只打算执行一次,它也会提供更高的值。下面是示例代码(质数,10个循环):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(int w=0;w<10;w++){
synchronized(s){
  long t1 = System.currentTimeMillis();
  long num = 2000;
for (long i = 1; i < num; i++) {
        long p = i;
    int j;
    for (j = 2; j < p; j++) {
            long n = p % i;
        }
    }
long t2 = System.currentTimeMillis();
 System.out.println("Time>>>>>>>>>>>> " + (t2-t1) );
}

这里的插装代码(这里的System.currentMilliSeconds()给出了插装发生的时间,它不是执行时间的度量,执行时间来自obove SOP语句):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public void visitInsn(int opcode)
    {
        switch(opcode)
        {
          // Scenario 1
        case 194: 
            visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io   /PrintStream;");
            visitLdcInsn("TIME Arrive: "+System.currentTimeMillis());
            visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
            break;

        // scenario 3
        case 195: 
            visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
            visitLdcInsn("TIME exit : "+System.currentTimeMillis());
            visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
            break;
        }

        super.visitInsn(opcode);

       // scenario 2
       if(opcode==194)
        {
            visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
            visitLdcInsn("TIME enter: "+System.currentTimeMillis());
            visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");

        }

        }

我不能找到它发生的原因和如何纠正它。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-11-26 13:23:17

原因在于用于运行代码的JVM的内部结构。我假设这是一个HotSpot JVM,但是下面的答案对于大多数其他实现都是同样正确的。

如果您触发以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int result = 0;
for(int i = 0; i < 1000; i++) {
  result += i;
}

这将由Java编译器直接转换成Java字节码,但是在运行时,JVM会很容易地看到这段代码什么也没做。执行此代码不会对外部(应用程序)世界产生任何影响,那么为什么JVM要执行它呢?这正是编译器优化为您做的事情。

但是,如果您触发以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int result = 0;
for(int i = 0; i < 1000; i++) {
  System.out.println(result);
}

Java运行时不能再优化您的代码。整个循环必须始终运行,因为System.out.println(int)方法总是在做一些实际的事情,这样代码的运行速度就会变慢。

现在让我们看一下你的例子。在您的第一个示例中,您基本上编写了以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
synchronized(s) {
   // do nothing useful
}

Java运行时可以很容易地删除整个代码块。这意味着:将不会有同步!在第二个示例中,您将编写以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
synchronized(s) {
   long t1 = System.currentTimeMillis();
   // do nothing useful
   long t2 = System.currentTimeMillis();
   System.out.println("Time>>>>>>>>>>>> " + (t2-t1));
}

这意味着有效的代码可能如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
synchronized(s) {
   long t1 = System.currentTimeMillis();
   long t2 = System.currentTimeMillis();
   System.out.println("Time>>>>>>>>>>>> " + (t2-t1));
}

这里重要的是,优化后的代码将被有效地同步,这是在执行时间方面的一个重要区别。基本上,您正在测量同步某些内容所花费的时间(如果JVM意识到s没有锁定在您的代码中的其他位置,那么在几次运行后可能会优化掉这个时间)(流行语:临时优化,如果将来加载的代码也将在s上同步,则可能会取消优化)。

你真应该读一读这篇文章:

例如,您的测试错过了一次预热,因此您还在测量JVM将用于字节码到机器码优化的时间。

顺便说一句:在String上同步几乎总是一个坏主意。您的字符串可能是也可能不是interned,这意味着您不能绝对确定它们的身份。这意味着,同步可能起作用,也可能不起作用,您甚至可能对代码的其他部分进行同步。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20193548

复制
相关文章
使用动态时间规整来同步时间序列数据
在数据相关的职业生涯中遇到最痛苦的事情之一就是必须处理不同步的时间序列数据集。差异可能是由许多原因造成的——日光节约调整、不准确的SCADA信号和损坏的数据等等。在相同的数据集中,在不同的点上发现几个差异是很常见的,这需要分别识别和纠正每一个差异。而且当使用它时,可能会无意中抵消另一个同步部分。幸运的是,在新的“动态时间规整”技术的帮助下,我们能够对所有的非同步数据集应用一种适用于所有解决方案。
deephub
2021/08/20
1.2K0
【资讯】我们需要更多数据还是精确数据?
不断过滤清理数据,直到确保它的正确性的日子已经逐渐成为奢望,尤其是当IT部门需要以更快的速度和更多的灵活性来响应业务部门的需求时。但是,提供实时数据的使用也让CIO们产生了一个基本问题:数据究竟如何才算正确呢? Farzad Mostashari,美国卫生和公众服务部的,前卫生信息技术的国家协调员,就曾经论证了解决错误数据的方法就是更多的错误数据。在去年夏天举行的一个信息质量会议上,他曾经说过,不断增加的数据“为你提供了上下文”。其他专家,比如Michael Berry,Tri
小莹莹
2018/04/19
5120
synchronized同步代码块
通过语法可以了解到synchronized同步代码块的原理其实很简单,当前线程必须要获得目标资源的锁才可以执行,如果一个线程无法获取资源锁,则进入阻塞状态,待到获取资源锁(占用资源锁的线程执行完之后会释放资源锁)之后方可进入运行状态执行任务。
南风
2018/10/18
1.1K0
我们需要更多“网络游侠”
本文介绍了“白帽子”黑客这一网络信息安全领域的特殊职业,以及培养“白帽子”黑客的必要性。文章指出,“白帽子”黑客是网络空间的侠客,对网络安全负有重大责任。目前,网络安全人才供不应求,市场缺口极大。同时,培养“白帽子”黑客的过程需要政府、高校、企业和社会共同努力。
云资讯小编
2017/07/14
1.2K0
我们需要更多“网络游侠”
【Java 基础篇】Java同步代码块解决数据安全
多线程编程是现代应用程序开发中的常见需求,它可以提高程序的性能和响应能力。然而,多线程编程也带来了一个严重的问题:数据安全。在多线程环境下,多个线程同时访问和修改共享的数据可能导致数据不一致或损坏。为了解决这个问题,Java提供了一些机制来确保多线程之间的数据安全性,其中之一就是同步代码块。本文将深入探讨Java同步代码块的概念、用法以及如何使用它来解决数据安全问题。
繁依Fanyi
2023/10/12
3230
【Java 基础篇】Java同步代码块解决数据安全
创建ASM实例及ASM数据库
文件按分配单元AUs(allocation units)平衡分布在磁盘组的所有磁盘中,ASM使用索引技术来跟踪每个AUs的位置
Leshami
2018/08/07
1.4K0
2.2synchronized同步语句块
使用synchronized虽然能够避免不同步的现象出现,但是也会出现弊端,比如代码执行时间过长,那么其他线程就必须等待该线程执行完毕释放锁之后才能拿到锁。 面对这种问题可以使用同步代码块来解决。 2
用户1134788
2018/01/05
9290
2.2synchronized同步语句块
crontab/ntpdate——时间同步
在创建集群时,我们需要统一每一台主机的时间,这就需要用如下方式: 首先yum install nptdate -y,安装好时间同步工具 接下来: ntpdate time1.aliyun.com 使用阿里云的时间服务器
gzq大数据
2020/11/11
2.3K0
crontab/ntpdate——时间同步
集群时间同步
       在Hadoop上做实时调度器的实验时,一些作业总是被不正常地kill掉。调试过后,发现从主节点上获取的时间和从从节点上获取的时间不一致。研究了很久,发现这是从节点和主节点的时间不一致导致的,所以决定将集群的时间给同步了。
jiewuyou
2022/09/23
2K0
使用mongosync同步数据
注意: 我下面的这个mongodb版本较低(3.2.16), 还可以用这个工具来同步数据。工具不支持更高版本的mongodb了.
保持热爱奔赴山海
2019/09/17
1.2K0
自动与时间服务器时间同步,Windows系统时间同步(附时间同步服务器地址)
] 分支,并双击 SpecialPollInterval 键值,将对话框中的“基数栏”选择到“十进制”上,如图1所示
全栈程序员站长
2022/09/13
12.3K0
自动与时间服务器时间同步,Windows系统时间同步(附时间同步服务器地址)
linux 同步北京时间 局域网同步时间
设置时区为亚洲/上海 timedatectl set-timezone Asia/Shanghai
全栈程序员站长
2022/09/13
5.8K0
linux 同步北京时间 局域网同步时间
Windows下更改并使用NTP(时间同步服务器)服务器同步电脑时间
Windows自带的time.windows.com没法同步,只能自己更改NTP服务器。 该方法在Windows 10中测试通过,Windows 7应该也没问题,Windows 11据说要取消控制面板不确定。
kr
2022/06/15
19.2K0
Windows下更改并使用NTP(时间同步服务器)服务器同步电脑时间
gPTP时钟同步(时间同步)协议简介
• 教官首先发出“齐步—–走”的命令,大家听到“齐步”二字后,开始调整动作,最终所有人实现动作同步。
NTP网络同步时钟
2022/03/09
9.1K1
gPTP时钟同步(时间同步)协议简介
Oracle ASM diskgroup在主机重启后启动失败
环境:RHEL 6.4 + Oracle 11.2.0.3 + ASM单实例 1.重启主机后,+DATA diskgroup启动不成功,现象如下: [grid@JY-DB ~]$ crsctl stat res -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE
Alfred Zhao
2019/05/24
1.5K0
时间,需要估算
【字数:2085;阅读时长:6min】 估算时间的共性就是——我们绝大多数人根本无法准确的预估时间。 因为预估时间对于我们来说充满着熟悉和陌生的冲突,而多数情况下,我们所做的每个任务都会有陌生的成分,如果我们不会分解任务或者没有一个必然的过程,那么我们是无法来估算时间的。 我们现在提出结论是:如果想提高估算时间的能力,必须养成一个习惯——那就是: 在做任何事情之前,先判断对其的熟悉或者陌生的程度,再判断估算完成任务所需要的时间 为了可以很好的完成估算任务的所需时间,我们将“估算时间”分解成四句话来理解 1
用户2025931
2018/06/19
5890
Linux系统时间同步
server 0.centos.pool.ntp.org iburst
Dlimeng
2023/06/28
3850
java基础提升篇:synchronized同步块和volatile同步变量
初遇 Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。 synchronized同步块 Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。 有四种不同的同步块:  
好好学java
2018/07/02
1.3K0
ubuntu关闭时间同步
虽然System clock synchronized: no,但是时间仍然在同步。因为还要重启一下服务。这一步特别重要。
超级大猪
2019/11/22
6K0
点击加载更多

相似问题

使用ASM检测可能的同步死锁

12

MPI使用更多cpus需要更多时间

31

SQL insert数据需要更多时间

41

使用left outer join获取数据需要更多时间

12

这个同步块需要吗?

52
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文