小编The*_*tor的帖子

**BUSTED**如何使用sun.misc.Unsafe加快字节[]查找速度?

我正在尝试使用Unsafe迭代内存而不是遍历byte []中的值.使用unsafe分配内存块.内存足以容纳65536个字节值.

我在尝试这个:

char aChar = some character

if ((byte) 0 == (unsafe.getByte(base_address + aChar) & mask)){
 // do something
}
Run Code Online (Sandbox Code Playgroud)

代替:

char aChar = some character

if ((byte) 0 == ( lookup[aChar] & mask )){
 // do something
}
Run Code Online (Sandbox Code Playgroud)

认为 Unsafe可以比使用常规数组访问更快地访问内存,并对每个索引执行索引检查...

只是一厢情愿地认为jvm会有一个特殊的操作(不安全),它会以某种方式使常规数组访问和迭代更快.在我看来,jvm在正常的byte []迭代中运行良好,并且可以使用普通的,纯粹的,vanilla java代码快速完成它们.

@millimoose击中众所周知的"钉在头上"

"不安全可能对许多事情都有用,但这种微观优化程度不是其中之一." - 毫米"

在非常严格的有限情况下使用Unsafe会更快:

  • (仅64位jvm)对于单个65535字节[]查找更快,每次测试只完成一次.在这种情况下,64_bit jvm上的UnsafeLookup_8B快24%.如果测试重复进行,每次测试都进行两次,那么正常方法现在比不安全快30%.在冷jvm上的纯解释模式中,Unsafe到目前为止更快 - 但只是第一次,仅适用于较小的数组大小.在32位标准Oracle JVM 7.x上,正常情况比使用unsafe快三倍.

使用Unsafe(在我的测试中)比较慢:

  • 在Oracle java 64位和32位虚拟机上都较慢
  • 无论操作系统和机器架构如何都会变慢(32位和64位)
  • 即使server调用了jvm选项也会更慢

  • 在32位jvm(64位甚至更慢?)下面的代码中,不安全从9%或更多(1_GB数组和UnsafeLookup_8B(最快的一个)慢)

  • 在64位jvm下,不安全性从234%或更高(1_MB数组和UnsafeLookup_1B(最快速度为1))变慢.

这有什么理由吗?**

当我运行下面发布的代码yellowB(检查1GB字节[])时,法线仍然是最快的:

C:\Users\wilf>java -Xms1600m -Xprof -jar "S:\wilf\testing\dist\testing.jar"
initialize data...
initialize data …
Run Code Online (Sandbox Code Playgroud)

java performance unsafe

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

如何在同一端口托管SOAP服务和REST服务?

有谁知道如何配置它,以便SOAP服务和REST服务可以在应用程序服务器之外使用Jersey(Grizzly)共享同一个端口?

  • 我的肥皂服务在www.someurl.com:port/soap/crm
  • 我的休息服务是www.someurl.com:port/crm

这些服务共享相同的端口但不是相同的基本URL,因此应该能够在该端口上并行运行.但是,有一个端口绑定错误..

所有这些都在自定义服务应用程序中,并且没有web.xml等.

REST服务使用Jersey,Soap服务是在端点上发布的类"ReceptionService".

URI soapUri = URI.create("192.168.0.0:1234\soap\Crm")
URI restUri = URI.create("192.168.0.0:1234\crm")

// START SOAP SERVICE
Object reception = getObjectResource(ReceptionService.class);
Endpoint e = Endpoint.publish(soapUri, reception);

// START REST SERVICE    
ResourceConfig rc = new ResourceConfig().packages("company.rest");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(restUri, rc);
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,Grizzly吐出'java.net.BindException:地址已经在使用:bind'

我的肥皂服务接待设置如下:

    @WebService(targetNamespace = "company.crm")
    @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL,      parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
    public class Reception implements ReceptionService {
     ... methods
    }
Run Code Online (Sandbox Code Playgroud)

我的休息服务课像往常一样注释......

@Path("hello/{username}")
public class Hello { ... }
Run Code Online (Sandbox Code Playgroud)

我在这方面有点新手,任何指针都会受到赞赏.请不要打扰我建议运行应用程序服务器.这不是问题 - 问题是如何解决端口绑定问题而不转移到其他一些Web服务框架?

注意RE BOUNTY:我不能完全忘记这一点

"赏金获胜者将演示如何在同一端点上一起使用Jersey for REST和Java …

java rest soap endpoint

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

如何在不使用此方法的情况下在接口默认方法内同步?

我在需要同步的接口中有许多默认方法,似乎只有this可用:

default void addUniqueColumns(List<String> names) {
    synchronized (this) {
        ... do something
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我想在私有锁上同步而不是this为了更好的控制:

default void addUniqueColumns(List<String> names) {
    synchronized (lock) {  // how to get a private lock in a default method??
        ... do something
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案?聪明的解决方法?或者只是忍受它:)!

java synchronized java-8 default-method

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

什么Java库对象封装了一个数字和`TimeUnit`?

我想传递一个时间数字,TimeUnit它就在.

long number = some number;
TimeUnit timeUnit = some arbitrary time unit
Run Code Online (Sandbox Code Playgroud)

什么可以Object将Java中的时间和时间单元保持在一起?

java time duration java-8 timeunit

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

创建从 byte[] 到原始字节流的 Stream

我有一个byte[],我想制作一个字节流。

对于int[]andlongdouble,我在 Arrays 类中看到了方法:

Arrays.stream(int[] array)
Arrays.stream(long[] array)
Arrays.stream(double[] array)
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到任何 method Arrays.stream(byte[] array)

那么,将字节原语流作为实际字节获取的最简单、最简洁的方法是什么?

我需要对 byte[] 进行转换,并且需要一个字节流来使用所有 Stream 函数来完成此操作(不,我不想将它们全部转换为整数。)

谁有好的解决办法吗?

附言。其他人从微控制器 API 向我提供 byte[] ...所以如果没有必要,我不想使用其他数据类型。

谢谢。

java

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

为什么在try-with-resources中获取`Stream <String>`时BufferedReader没有关闭?

Stream在try-with-resources中使用a 时,应该关闭阅读器.

鉴于这种:

try(Stream<String> lines = new BufferedReader(reader).lines()) {
            return lines.map(it -> trim ? it.trim() : it)
                    .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

......读者没有被关闭?

此测试失败:

    AtomicBoolean closed = new AtomicBoolean(false);

    Reader r = new StringReader("  Line1 \n Line2") {

                @Override
                public void close() {
                    super.close();
                    closed.set(true);
                }

            };

    try(Stream<String> lines = new BufferedReader(r).lines()) {
            lines.map(it -> trim ? it.trim() : it)
                    .collect(Collectors.toList());
    }

    assertTrue("Reader was not closed.",closed.get());
Run Code Online (Sandbox Code Playgroud)

java java-8 try-with-resources java-stream autocloseable

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

为什么'Path.startsWith'行为与'String.startsWith'操作不同 - 即使对于'Path.getFilename'

我使用的是Java版本1.8.0_31.

我试图使用FileVisitor接口递归访问目录树.程序应该打印C:/books文件名以"Ver"开头的所有文件的名称.该目录C:/books有两个以"Ver"开头的文件,Version.yxyVersion1.txt.我尝试过使用file.getFileName().startsWith("Ver")但是返回false.

我错过了什么吗?这是我的代码:

public class FileVisitorTest {

    public static void main(String[] args) {

        RetriveVersionFiles vFiles = new RetriveVersionFiles();
        try {
            Files.walkFileTree(Paths.get("c:", "books"), vFiles);
        } catch (IOException e) {
            // TODO Auto-generated catch block
         e.printStackTrace();
        }
    }
}

class RetriveVersionFiles extends SimpleFileVisitor<Path> {

    public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
        System.out.println(file.getFileName().startsWith("Ver") + " "
              + file.getFileName());
        if (file.getFileName().startsWith("Ver")) {
            //not entering this if block
            System.out.println(file);
        }
        return FileVisitResult.CONTINUE;
   }
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是: …

java java.nio.file

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

Java Streams - 如何在每第n个项目中执行中间函数

我正在寻找一个Stream上的操作,使我能够每隔n项执行一次非终端(和/或终端)操作.虽然我使用素数流,例如,流可以很容易地生成网络请求,用户操作或其他一些冷数据或实时源.

由此:

    Duration start = Duration.ofNanos(System.nanoTime());

    IntStream.iterate(2, n -> n + 1)
            .filter(Findprimes::isPrime)
            .limit(1_000_1000 * 10)
            .forEach(System.out::println);

    System.out.println("Duration: " + Duration.ofNanos(System.nanoTime()).minus(start));
Run Code Online (Sandbox Code Playgroud)

对于像这样的流函数:

    IntStream.iterate(2, n -> n + 1)
            .filter(Findprimes::isPrime)
            .limit(1_000_1000 * 10)
            .peekEvery(10, System.out::println)
            .forEach( it -> {});
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

3
推荐指数
2
解决办法
1366
查看次数

使用Java 8,迭代地图中所有条目的最简洁方法是什么?

使用新Java 8迭代Map中所有条目的最简单方法是什么?

java lambda map java-8

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