Tag: 优化

这种颜色混合技巧如何工作?

我看到这个Java代码可以非常有效地在两种RGB888颜色之间进行完美的50%混合: public static int blendRGB(int a, int b) { return (a + b – ((a ^ b) & 0x00010101)) >> 1; } 这显然相当于单独提取和平均通道。 像这样的东西: public static int blendRGB_(int a, int b) { int aR = a >> 16; int bR = b >> 16; int aG = (a >> 8) & 0xFF; int bG = […]

为什么这个带有几个“或”语句的代码比在Java中使用查找表略快?

在查看我昨天( 这里 )提到的微优化问题时,我发现了一些奇怪的东西:Java中的一个or一个语句的运行速度比在一个布尔数组中查找一个布尔值要快一些。 在我的测试中,运行以下算法的long值从0到10亿,alg1大约快2%。 (我已经改变了算法测试的顺序,我得到了相同的结果)。 我的问题是: 为什么alg1更快? 我原本期望alg2稍快一些,因为它使用查找表,而alg1必须执行4次比较,3次或75%的输入操作。 private final static boolean alg1(long n) { int h = (int)(n & 0xF); if(h == 0 || h == 1 || h == 4 || h == 9) { long tst = (long)Math.sqrt(n); return tst*tst == n; } return false; } private final static boolean[] lookup = […]

获得Java签约的最快方式?

我想将float值的符号作为int值-1或1。 避免条件总是降低计算成本的好主意。 例如,我能想到的一种方法是使用快速bit-shift来获得符号: float a = …; int sign = a >> 31; //0 for pos, 1 for neg sign = ~sign; //1 for pos, 0 for neg sign = sign << 1; //2 for pos, 0 for neg sign -= 1; //-1 for pos, 1 for neg — perfect. 或者更简洁: int sign = (~(a […]

如何在java中实现有效的超时

有n对象执行某些操作。 执行操作后,将更新时间戳。 现在我想实现一个超时线程,它validation时间戳是否早于例如60秒。 我的第一个解决方案是使用一个线程(while-loop + sleep)执行该操作,该线程包含一个包含所有对象(包括最后一个时间戳)的列表。 现在我遇到的问题是,最糟糕的情况是线程需要59秒加上睡眠时间来决定超时。 我正在寻找像Timer这样的解决方案,可以更新延迟时间。 有任何想法吗?

提高crawler4j的性能

我需要编写一个webscraper,它可以擦除大约1M个网站并将其标题,描述和关键字保存到一个大文件中(包含已删除的URL和相关的单词)。 应从大文件中提取URL。 我在1M URL文件上运行了Crawler4j,并使用以下命令启动了webcrawler: controller.start(MyCrawler.class, 20) 。 20是任意数。 每个爬网程序将生成的单词传递到阻塞队列,以便单个线程将这些单词和URL写入文件。 我使用了1个编写器线程,以便不在文件上同步。 我将爬网深度设置为0(我只需要抓取我的种子列表) 运行这个晚上后,我只下载了大约200K的URL。 我正在使用有线连接在一台机器上运行刮刀。 由于大多数URL都是不同的主机,我不认为礼貌参数在这里有任何重要性。 编辑 我尝试使用非阻塞启动启动Crawler4j,但它刚被阻止。 我的Crawler4j版本是:4.2。 这是我正在使用的代码: CrawlConfig config = new CrawlConfig(); List headers = Arrays.asList( new BasicHeader(“Accept”, “text/html,text/xml”), new BasicHeader(“Accept-Language”, “en-gb, en-us, en-uk”) ); config.setDefaultHeaders(headers); config.setCrawlStorageFolder(crawlStorageFolder); config.setMaxDepthOfCrawling(0); config.setUserAgentString(“testcrawl”); config.setIncludeBinaryContentInCrawling(false); config.setPolitenessDelay(10); PageFetcher pageFetcher = new PageFetcher(config); RobotstxtConfig robotstxtConfig = new RobotstxtConfig(); RobotstxtServer robotstxtServer = […]

Java:哪个更快? 局部变量或访问封装?

我最近读了一个StackOverflow问题 ,表明在访问变量时,使用堆栈比堆更快: void f() { int x = 123; // <- located in stack } int x; // <- located in heap void f() { x = 123 } 但是,我无法通过我的头脑工作,这在我的例子中更快(因为我假设他们都在使用堆栈)。 我正在研究hitbox计算等,它在函数中使用了很多XY,宽度,高度变量(每个最多10-20次)。 每次使用对象的get()方法或在函数开头将其设置为局部变量是否更快? 在代码中,它更快(或更高效): void f() { doSomething(foo.getValue() + bar.getValue()); doSomethingElse(foo.getValue(), bar.getValue()); doAnotherThing(foo.getValue(), bar.getValue()); // … <- lot's of accessing (something.getValue()); } 要么 void g() { […]

JVM JIT诊断工具和优化技巧

我听到很多关于JVM JIT 可以做什么,但是没有看到很多关于如何分析JIT在程序的给定运行中实际执行的操作的信息。 有很多关于使用-XX:+PrintCompilation和-XX:+PrintOptoAssembly但它会导致很难解释的真正低级别的信息。 一般来说,在优化期间,我喜欢使用具有专用JIT预热时间等的常用操作的基准套件,但我希望能够看到哪些优化实际上触发了我的代码。 也许我的JVM考虑内联一个特定的方法调用,但它的一些东西使它决定不,或者JIT无法避免我的循环中的数组边界检查,因为我的措辞我的不变量和循环条件太模糊。 我希望像YourKit这样的工具能够支持某些forms的“JIT正在发生的事情”,但我无法在YourKit或其他任何地方找到支持。 理想情况下,我只是喜欢在我的程序运行期间JIT优化器正在思考的大脑转储。 假设我已经充分预热了我的function,它决定将三个方法内联到我的内循环中并将循环分成三个部分,中间部分没有数组边界检查,我想要总结这些决定和动机对他们来说 我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以确定正在发生的事情时会做些什么? 当然,低级-XX标志不是唯一的选择,可以吗? 我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。 不,这个问题不是因为过早优化而产生的! 🙂 编辑:我想我想要的一些东西是由-XX:+LogCompilation给出的,但是如果人们有这种活动的一般提示和工具,我仍然很好奇。

我可以使用压缩oops多于32 GB的堆

我能理解,使用压缩oops,我们只能使用32 GB的RAM。 有没有什么可以通过分配2堆或其他什么来使用更多? 谢谢Vineeth

优化简单的搜索算法

我一直在玩一个相当简单的自制搜索引擎,现在我正在考虑一些相关性排序代码。 它不是很漂亮,但是当谈到聪明的算法时我不是很好,所以我希望我能得到一些建议:) 基本上,我希望每个搜索结果都根据与搜索条件匹配的单词数得分。 每个确切单词3分,部分匹配1分 例如,如果我搜索“冬天的雪”,这些将是结果: 冬天的 雪 => 6点 冬天 下雪 => 4分 冬季 降雪 => 4分 冬日阳光=> 3分 冬季 降雪 => 2分 这是代码: String[] resultWords = result.split(” “); String[] searchWords = searchStr.split(” “); int score = 0; for (String resultWord : resultWords) { for (String searchWord : searchWords) { if (resultWord.equalsIgnoreCase(searchWord)) score += 3; […]

如何找出JVM应用于我的代码的优化?

JVM(尤其是HotSpot VM)因其在运行时可以应用的大量优化而闻名。 有没有办法查看某段代码,看看JVM实际上对它做了什么?