Tag: 性能

为什么终结器会有“严重的性能损失”?

有效的Java说: 使用终结器会严重影响性能。 为什么使用终结器破坏对象的速度较慢?

从Java中的文件中读取大量数据

我的文本文件包含以下forms的1 000 002数字: 123 456 1 2 3 4 5 6 …. 999999 100000 现在我需要读取该数据并将其分配给int变量(前两个数字)和其余所有( 1 000 000个数字)到数组int[] 。 这不是一项艰巨的任务,但是 – 这很糟糕。 我的第一次尝试是java.util.Scanner : Scanner stdin = new Scanner(new File(“./path”)); int n = stdin.nextInt(); int t = stdin.nextInt(); int array[] = new array[n]; for (int i = 0; i < n; i++) { array[i] = […]

Java集合和垃圾收集器

关于Java Web应用程序性能的一个小问题。 假设我有一个包含10个Rubrique对象的List listRubriques 。 Rubrique包含一个产品List ( List listProducts )和一个客户List ( List listClients )。 如果我这样做,内存中究竟会发生什么: listRubriques.clear(); listRubriques = null; 我的观点是,由于listRubriques为空,此列表之前引用的所有对象(包括listProducts和listClients )将很快被垃圾收集。 但是因为Java中的Collection有点棘手,因为我的应用程序存在相当大的性能问题,我正在问这个问题:) 编辑:我们现在假设我的Client对象包含List 。 因此,我的对象之间有一个循环引用。 如果我的listRubrique设置为null会发生什么? 这一次,我的观点是我的客户端对象将变得“无法访问”并可能造成内存泄漏?

HQL加入查询以急切获取大量关系

我的项目最近发现Hibernate可以采用多级关系,并且在单个连接HQL中急切地获取它们以生成我们需要的填充对象。 我们喜欢这个function,认为它会胜过懒惰的获取环境。 问题是,我们遇到的情况是,单个父母有十几个直接关系,一些子关系,其中一些在几个实例中有几十行。 结果是一个非常大的交叉产品,导致hql几乎永远地旋转它的轮子。 在我们放弃并杀死它之前,我们将记录变为11并且看到了超过100000次迭代。 很明显,虽然这种技术在某些情况下很有用,但它具有生活中的一切限制。 但是hibernate中最好的替代方案是什么呢? 我们不想懒惰加载这些,因为我们将进入更加糟糕的N + 1情况。 理想情况下,我希望让Hibernate预取所有的行和细节,但一次只做一个关系,然后将正确的细节对象保湿到正确的父对象,但我不知道它是否做了这样的事情。 建议? 更新: 所以我们得到了SQL这个查询生成的,事实certificate我错误地诊断了这个问题。 交叉产品并不是那么大。 我们直接在数据库中运行相同的查询,并在一秒钟内返回500行。 然而我们在hibernate日志中非常清楚地看到它进行了100K迭代。 是否有可能Hibernate会陷入你的人际关系或某事的循环中? 或者这应该被问为一个新问题?

关于空间/时间的Groovy集合性能考虑因素

与普通的Java for循环相比,Groovys集合方法(关于空间(!)和时间)的性能如何? 例如,对于这个用例: sum()vs for-loop with variable each()vs for-loop with variable inject()vs for-loop with variable 使用临时集合收集()与for循环 findAll()与for循环的临时集合 find()vs for-loop with variable 因此,考虑到这些结果,是否建议在关键环境中使用for循环而不是Groovy-collection-methods(例如Grails-WebApp)? 是否有关于Groovy / Grails性能(优化)的资源? 使用此GBench测试,我获得了以下CPU时间结果: user system cpu real forLoop 2578777 67 2578844 2629592 forEachLoop 2027941 47 2027988 2054320 groovySum 3946137 91 3946228 3958705 groovyEach 4703000 0 4703000 4703000 groovyInject 4280792 108 4280900 4352287 […]

Java lambdas比匿名类慢20倍

我在这里看到了很多关于Java lambdas性能的问题,但是大多数问题都像“Lambdas稍快一点,但在使用闭包时变慢”或“预热与执行时间不同”或其他类似的东西。 但是,我在这里遇到了一件相当奇怪的事情。 考虑这个LeetCode问题 : 给定一组非重叠间隔,在间隔中插入新间隔(必要时合并)。 您可以假设间隔最初是根据其开始时间排序的。 这个问题被标记很难,所以我认为线性方法不是他们想要的。 所以我决定想出一种聪明的方法,将二进制搜索与对输入列表的修改结合起来。 现在问题在修改输入列表时并不是很清楚 – 它表示“插入”,即使签名需要返回对列表的引用,但是现在也没关系。 这是完整的代码,但只有前几行与此问题相关。 我在这里保留其余部分,以便任何人都可以尝试: public List insert(List intervals, Interval newInterval) { int start = Collections.binarySearch(intervals, newInterval, (i1, i2) -> Integer.compare(i1.start, i2.start)); int skip = start >= 0 ? start : -start – 1; int end = Collections.binarySearch(intervals.subList(skip, intervals.size()), new Interval(newInterval.end, 0), (i1, i2) -> Integer.compare(i1.start, […]

Java匿名类效率的含义

这两种做事方式之间的效率(例如执行时间,代码大小等)是否有任何差异? 下面是创建对象并且什么都不做的人为例子,但我的实际场景可能是创建新的线程,监听器等。假设以下代码片段在循环中发生,以便它可能有所作为。 使用匿名对象: void doSomething() { for (/* Assume some loop */) { final Object obj1, obj2; // some free variables IWorker anonymousWorker = new IWorker() { doWork() { // do things that refer to obj1 and obj2 } }; } } 首先定义一个类: void doSomething() { for (/* Assume some loop */) { Object obj1, […]

Java TCP套接字:数据传输速度很慢

我设置了一个带有ServerSocket的服务器,用客户机连接到它。 它们通过交换机直接联网,ping时间<1ms。 现在,我尝试通过套接字的输出流将“大量”数据从客户端推送到服务器。 转移0.6Gb需要23分钟。 我可以通过scp在几秒钟内推送一个更大的文件。 知道我可能做错了什么吗? 我基本上只是循环并在套接字上调用writeInt。 速度问题与数据的来源无关,即使我只是发送一个恒定的整数而不是从磁盘读取。 我尝试将两侧的发送和接收缓冲区设置为4Mb,没有骰子。 我为读写器使用缓冲流,没有骰子。 我错过了什么吗? 编辑:代码 这是我制作套接字的地方 System.out.println(“Connecting to ” + hostname); serverAddr = InetAddress.getByName(hostname); // connect and wait for port assignment Socket initialSock = new Socket(); initialSock.connect(new InetSocketAddress(serverAddr, LDAMaster.LDA_MASTER_PORT)); int newPort = LDAHelper.readConnectionForwardPacket(new DataInputStream(initialSock.getInputStream())); initialSock.close(); initialSock = null; System.out.println(“Forwarded to ” + newPort); // got my new port, […]

在Java中读取相对较大的字节文件的最快方法

使用Java的I / O方法读取相对较大的文件的最快方法是什么? 我当前的解决方案使用BufferedInputStream保存到分配了1024字节的字节数组。 然后将每个缓冲区保存在ArrayList以供以后使用。 整个过程通过一个单独的线程(可调用接口)调用。 虽然不是很快。 ArrayList outputArr = new ArrayList(); try { BufferedInputStream reader = new BufferedInputStream(new FileInputStream (dir+filename)); byte[] buffer = new byte[LIMIT]; // == 1024 int i = 0; while (reader.available() != 0) { reader.read(buffer); i++; if (i <= LIMIT){ outputArr.add(buffer); i = 0; buffer = null; buffer = new byte[LIMIT]; […]

Java本地vs实例变量访问速度

所以我的问题是关于Java中的变量访问速度。 今天在我的“CS”(如果你可以称之为)中,老师提出了一个与List的下面类似的例子: public class ListExample { private Node head; private Node tail; private class Node { /* … */ } public void append(T content) { if (!isEmpty()) { Node dummy = new Node(content); head = dummy; tail = dummy; head.setNext(head); // or this dummy.setNext(dummy); } else { /* … */ } } // more methods […]