小编Sus*_*anW的帖子

在Java中,可以比&&快吗?

在这段代码中:

if (value >= x && value <= y) {
Run Code Online (Sandbox Code Playgroud)

什么时候value >= xvalue <= y没有特定模式的情况一样真假,使用&运算符会比使用更快&&吗?

具体来说,我正在考虑如何&&懒惰地评估右侧表达式(即,仅当LHS为真),这意味着条件,而&在此上下文中的Java 保证严格评估两个(布尔)子表达式.值结果是相同的两种方式.

不过,虽然一个>=<=运营商将使用一个简单的比较指令时,&&必须包括一个分支,该分支是易受分支预测失败 -按本非常著名的问题:为什么快处理有序数组不是一个排序的数组?

因此,强制表达式没有惰性组件肯定会更具确定性,并且不容易受到预测失败的影响.对?

笔记:

  • 很明显,如果代码看起来如此,我的问题的答案就是否定:if(value >= x && verySlowFunction()).我专注于"足够简单"的RHS表达.
  • 无论如何,那里有一个条件分支(if声明).我无法向自己证明这是无关紧要的,而且替代配方可能是更好的例子,比如boolean b = value >= x && value <= y;
  • 这一切都落入了可怕的微观优化世界.是的,我知道:-) ......虽然很有趣?

更新 只是为了解释为什么我感兴趣:我一直在盯着马丁汤普森在他的机械同情博客上撰写的系统,在他来到并谈到 Aeron之后.其中一个关键信息是我们的硬件中包含了所有这些神奇的东西,我们的软件开发人员不幸地无法利用它.别担心,我不打算在我的所有代码上使用///// :-) ...但是这个网站上有很多关于通过删除分支来改进分支预测的问题,并且它发生了对我来说,条件布尔运算符是测试条件的核心.

当然,@ StephenC提出了一个奇妙的观点,即将代码弯曲成奇怪的形状可以使JIT更容易发现常见的优化 - 如果不是现在,那么将来也是如此.并且上面提到的非常着名的问题是特殊的,因为它推动预测复杂性远远超出实际优化. …

java performance processing-efficiency microbenchmark branch-prediction

70
推荐指数
4
解决办法
7487
查看次数

中断的Java线程是否真的可以跳过finally子句?

我检查到该守护进程的JVM治疗线程经常重复的传闻finally在一些特殊的方法块(他们不这样做,好吗?),当我读了这一点,从甲骨文的Java教程:

注意:如果JVM在执行trycatch代码时退出,则该finally块可能无法执行.同样,如果执行trycatch代码的线程被中断或终止,即使应用程序作为一个整体继续,finally块也可能不会执行.

(重点是我的.)关于打断的一点引起了我的注意!

我的信念是,如果一个线程在try/catch代码中并且被中断,那么我们要么(或最终进入)一个状态(例如睡眠,等待)我们最终投掷一个InterruptedException,或者我们不是,我们正常或异常退出,但在所有情况下,我们都会遵守该finally条款.

我错过了什么?finally在应用程序继续运行时,是否真的有一种方法可以让线程被中断然后跳过a ?

java multithreading finally

16
推荐指数
1
解决办法
289
查看次数

清洁API设计

哪种设计API更好:

Example A:
public class UserService {
  public void addUser(final User user);
  public void addUserToIndex(final User user, final int index);
  public User lookUpUser(final User user);
  public User getUserByIndex(final int index );
  public void removeUser(final User user);
  public List<User> getAllUsers();
}

Example B:
public class UserService {
  public void add(final User user);
  public void add(final User user, final int index);
  public User lookUp(final User user);
  public User get(final int index);
  public void remove(final User user);
  public List<User> getAll();
}
Run Code Online (Sandbox Code Playgroud)

显然这段代码不会运行 - …

java coding-style

5
推荐指数
1
解决办法
1165
查看次数

为什么Java数组固定长度?

int[] array = new int[10]; // Length is fixed when the array is created.
Run Code Online (Sandbox Code Playgroud)

创建数组时,将建立数组的长度.创建后,其长度是固定的.

为什么必须这样?

java arrays fixed

5
推荐指数
2
解决办法
2384
查看次数

为什么这个java进程不释放内存?

我写了一个java应用程序,我在Fedora 24下运行了java进程。然后我检查了jconsole,发现它使用了大约5到10兆字节的内存。垃圾收集的效果在图中也可见。

这是屏幕截图: jconsole 截图

然后我检查了我的系统监视器,发现相同的进程 ID 有超过 100 兆字节的内存使用量。

这是屏幕截图:

系统监视器截图

请告诉我为什么进程不释放未使用的内存?

有什么办法可以释放吗?

java memory memory-management heap-memory

5
推荐指数
1
解决办法
8131
查看次数

用sed替换行中的最后一个字符

我试图用相同的字符和引号替换行中的最后一个字符 '

这是sed代码

 sed "s/\([A-Za-z]\)$/\1'/g" file1.txt > file2.txt
Run Code Online (Sandbox Code Playgroud)

但不起作用.错误在哪里?

sed

3
推荐指数
1
解决办法
3万
查看次数

不应该循环的代码(带有fork)是循环的

所以我有以下C代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
    int i = 0, n;
    n = 5;
    pid_t pid;
    printf("i=%d Right before the loop\n", i, getpid(), getppid());
    for (i = 0; i < n; i++){
        pid = fork();
        if (pid <= 0){
            printf("something happens in loop #%d. pid = %d\n", i, pid);
            break;
        }
        printf("End of loop #%d\n", i);
    }

    printf("i=%d My process ID = %d and my parent's ID = %d\n", i, getpid(), getppid());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只有一个问题:为什么

printf("i=%d …
Run Code Online (Sandbox Code Playgroud)

c linux ubuntu process

2
推荐指数
1
解决办法
103
查看次数

map {}和map()有什么区别

从此链接显示一些Scala示例:http :
//spark.apache.org/docs/latest/mllib-collaborative-filtering.html

map{}和之间有什么区别map()

val ratings = data.map(_.split(',') match { case Array(user, item, rate) =>
  Rating(user.toInt, item.toInt, rate.toDouble)
})

val usersProducts = ratings.map { case Rating(user, product, rate) =>
  (user, product)
}
Run Code Online (Sandbox Code Playgroud)

scala

1
推荐指数
1
解决办法
1363
查看次数