vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索

vc++调用jni

最终,当Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,该代码对整数docID,术语频率和位置的顺序块进行解码,并将它们匹配(例如,对BooleanQuery并集或交集) ),则为每个匹配项计算得分,并在收集过程中保存具有竞争力的匹配项。 甚至显然复杂的查询(如FuzzyQueryWildcardQuery FuzzyQuery经过重写过程,从而将其简化为更简单的形式(如BooleanQuery 。 Lucene的热点非常简单,以至于无法通过将它们移植到本地C ++(通过JNI)来对其进行优化!

因此,我这样做了,创建了lucene-c-boost github项目,其结果是令人兴奋的:

任务 QPS基础 StdDev基地 QPS选择 选择标准 变化百分比
高低 469.2 (0.9%) 316.0 (0.7%) 0.7 X
模糊1 63.0 (3.3%) 62.9 (2.0%) 1.0 X
模糊2 25.8 (3.1%) 37.9 (2.3%) 1.5倍
和高级 50.4 (0.7%) 110.0 (0.9%) 2.2倍
或高低 46.8 (5.6%) 106.3 (1.3%) 2.3 X
低期 298.6 (1.8%) 691.4 (3.4%) 2.3 X
或HighNotMed 34.0 (5.3%) 89.2 (1.3%) 2.6倍
或高不高 5.0 (5.7%) 14.2 (0.8%) 2.8倍
通配符 17.2 (1.2%) 51.1 (9.5%) 3.0 X
高高 21.9 (1.0%) 69.0 (1.0%) 3.5 X
或高级 18.7 (5.7%) 59.6 (1.1%) 3.2倍
或高高 6.7 (5.7%) 21.5 (0.9%) 3.2倍
或高低 15.7 (5.9%) 50.8 (1.2%) 3.2倍
医学术语 69.8 (4.2%) 243.0 (2.2%) 3.5 X
高或低 13.3 (5.7%) 46.7 (1.4%) 3.5 X
还是不高 26.7 (5.8%) 115.8 (2.8%) 4.3 X
高端 22.4 (4.2%) 109.2 (1.4%) 4.9倍
前缀3 10.1 (1.1%) 55.5 (3.7%) 5.5 X
高低 62.9 (5.5%) 351.7 (9.3%) 5.6倍
内部NRQ 5.0 (1.4%) 38.7 (2.1%) 7.8倍

这些结果显示在完整的,多领域的Wikipedia英语索引中,包含33.3 M个文档。 除了令人惊讶的加速性能外,还很高兴看到优化的C ++版本的差异(StdDev列)通常较低,因为(大部分)热点已被排除在等式之外。

该API易于使用,并且可与默认编解码器一起使用,因此您无需尝试重​​新编制索引即可:代替IndexSearcher.search ,请调用NativeSearch.search 。 如果查询可以优化,它将被优化; 否则,它将无缝地回IndexSearcher.search 。 它与Lucene完全分离,并与现有的Lucene 4.3.0 JAR一起使用,使用Java的反射API来获取必要的位。

这都是非常新的代码,我敢肯定有很多令人兴奋的错误,但是(在经过一些有趣的调试之后!)使用NativeSearch.search时,所有Lucene核心测试现在都可以通过。

这不是Lucene的C ++端口

此代码绝对不是Lucene的常规C ++端口。 相反,它实现了一组非常狭窄的类,特别是常见的查询类型。 这些实现不是通用的:它们硬编码(专门化)特定代码,删除所有类似ScorerDocsEnumCollectorDocValuesProducer等的抽象。

在何时应用优化存在一些主要限制:

  • 到目前为止仅在Linux和Intel CPU上进行了测试
  • 需要Lucene 4.3.x
  • 必须将NativeMMapDirectory用作Directory实现,该实现将整个文件映射到RAM(避免基于Java的MMapDirectory必须执行的分块)
  • 必须使用默认编解码器
  • 仅支持按分数排序
  • 没有一个优化的实现使用advance :首先,此代码相当复杂,要移植到C ++会花费很多工作;其次,受益于先进的查询通常已经非常快了,因此我们不妨将它们留在Java中

BooleanQuery已优化,但仅当所有子句都是针对同一字段的TermQuery时才进行优化。

C ++不比Java快!

无论如何,不​​一定如此:在有人大声疾呼这些结果如何“证明” Java比C ++慢得多之前,请记住,这远非“纯粹的” C ++ vs Java测试。 至少有以下三个单独的更改混合在一起:

  • 算法更改。 例如, lucene-c-boost有时使用BooleanScorer ,其中Lucene使用BooleanScorer2 。 确实,我们需要修复Lucene来进行类似的算法更改(当它们更快时)。 特别是,在上述结果中包括Not子句以及IntNRQ所有OrXX查询都将从算法更改中受益。
  • 代码专业化: lucene-c-boost将搜索作为强大的可怕外观函数来实现,从而删除了所有不错的Lucene抽象。 尽管在Lucene中显然需要抽象,但是不幸的是,它们增加了运行时的开销,因此删除这些抽象会带来一些好处。
  • C ++与Java

究竟是哪一部分收益多少尚不清楚。 实际上,我需要创建“匹配”的专用Java源代码来进行更纯粹的测试。

此代码很危险!

具体地说,每当将本地C ++代码嵌入Java时,Java开发人员都认为我们抛弃了C ++带来的所有这些有趣的问题,总是存在风险。 例如,如果存在错误(可能是!),或者甚至是应用程序滥用了无辜的API,例如在其他线程仍在使用IndexReader时意外关闭了IndexReader ,则该过程将遇到Segmentation Fault ,并且操作系统将破坏JVM。 。 可能还有内存泄漏! 而且,是的,C ++源代码甚至使用goto语句 。

工作正在进行中…

这是一项正在进行的工作,仍然有许多想法需要探索。 例如,Lucene的4.3.x版的默认PostingsFormat店大端多头,这意味着小端的Intel CPU必须做字节交换的每个帖子块进行解码时,这么一件事是尝试一个PostingsFormat在搜索时CPU更好地优化。 位置查询,过滤器和嵌套BooleanQuery以及某些配置(例如,省略规范的字段)尚未进行优化。 欢迎补丁!

尽管如此,初步的结果还是很有希望的,如果您愿意冒险冒险以换取大幅度的加速,请稍作调整并报告。

参考:来自我们的JCG合作伙伴 Michael Mc Candless的Changeing Bits博客通过JNI使用C ++进行了快速Lucene搜索 。

翻译自: https://www.javacodegeeks.com/2013/06/screaming-fast-lucene-searches-using-c-via-jni.html

vc++调用jni

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hide show vue 动画_jQuery动画效果

-------------------------------------------------------------------------------------------------------1. 隐藏和显示show()方法和hide()方法是jQuery中最基本的动画方法。在HTML文档里,为一个元素调用hide()方法,会将该元素的display样式改为“n…

使用Java的Selenium:Google搜索

1.概述 在本教程中,我们将探讨如何将Selenium与Java结合使用。 我们将使用Selenium打开Goog​​le,进行搜索,然后单击URL。 该代码在Github上可用。 2.什么是硒? Selenium使Web浏览器自动化。 就是这样 Selenium使我们能够模拟…

润乾报表分组求和_一招搞定各种报表合计需求

一、常用合计方案在有专业报表工具之前,常用的实现方案有:1) SQL“select sum(字段) from 表 group by 字段 order by 字段“可以实现简单的分组数据合计、条件合计,这种方式有一个很明显的缺点,就是随着合计需求复杂度…

Spring Security 6.x 系列(12)—— Form表单认证登录注销自定义配置

一、前言 在本系列文章中介绍了 Form 表单认证和注销流程,对部分源码也进行详细分析。 本章主要学习 Spring Security 中表单认证登录注销的相关自定义配置。 二、自定义登录页面 Spring Security 表单认证默认规则中对未认证的请求会重定向到默认登录页面&…

中奖名单模板_春分纪中奖名单出炉~才艺主公用“树叶阵法”致敬率土!

在上周发起的“率土春分纪”活动里小率每天都能在后台中收获主公们的“春天故事”今天小率将优质投稿整理出来分享给各位主公1春分诗词春赋雨水以将兮,天微微复日暖;春分之临兮,地脉脉而野苏。美好触手可及,万事恰逢转机。且看柳嫩…

JDK 10的摘要Javadoc标签

JDK 10通过发行JDK-8173425 引入了Javadoc标签{summary} (“ Javadoc需要一个新标签来指定摘要。”)。 这个新标签允许开发人员显式指定Javadoc注释的哪些部分出现在“摘要”中,而不是依靠Javadoc的默认处理来寻找一个时间和空间来划定注释的…

用c语言写代码_如何避免用动态语言的思维写Go代码

由于招聘市场上Go工程师的供给量不足,所以在招人的时候我们招了不少愿意转型用Go语言进行开发的PHP工程师,不过虽说换了个语言,在他们代码的时候还是能发现很多PHP的影子。if语句后面非要带括号这种问题就不说了,这属于不懂事&…

java ee cdi_Java EE CDI依赖关系消歧示例

java ee cdi在本教程中,我们将向您展示如何避免CDI bean中的依赖关系消除歧义。 在CDI中,我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入。 依赖性消除歧义的问题是客户端如何在不同的实现中调用特定的实现,而不会发生任何错…

tfw文件如何导入cad_教你三维家3d设计软件如何导入cad文件

一、导入CAD户型图的,注意点:CAD图要求:除墙体外,其它线段不可出现,(如:门、柱子、窗、阳台、标注、家具、植物、摆件等)且墙体线条要闭合,保存DXF格式。第一步:点击户型图--本地上传CAD图。第二…

用EnumMaps映射枚举键

这是一种在JDK中存在很长时间的类型,当我们要定义以枚举类型作为键的映射时会派上用场: EnumMap是一种特殊的Map 。 我们将为给定的枚举创建一个映射: public enum CoffeeType {ESPRESSO, POUR_OVER, FRENCH_PRESS }EnumMap在创建时需要注意…

同级选择器_10-CSS3选择器详解

CSS3在CSS2基础上,增强或新增了许多特性, 弥补了CSS2的众多不足之处,使得Web开发变得更为高效和便捷。CSS3的现状浏览器支持程度不够好,有些需要添加私有前缀移动端支持优于PC端不断改进中应用相对广泛应对的策略:渐进…

机器人庄园作文_十年后的家乡作文精选8篇

十年后的家乡作文精选8篇十年后的家乡作文:十年后的家乡十年前我的家乡美丽富饶,家前的小溪清澈见底,小溪妹妹还:“哗啦啦”的唱起了欢乐的歌谣。树木葱葱茏茏,花朵都露出了美丽可爱的笑脸,蝴蝶、蜜蜂、小鸟…

java heroku_Heroku和Java –从新手到初学者,第2部分

java heroku问题 所以过了几天,我可以回到我的Recaps小项目。 我从检查日志开始,发现了以下内容: 2012-03-04T01:52:5100:00 heroku[web.1]: Idling 2012-03-04T01:52:5300:00 heroku[web.1]: Stopping process with SIGTERM 2012-03-04T01:…

存储限制_明年6月份开始,谷歌相册将终止免费无限存储服务

站长之家(ChinaZ.com)11月12日 消息:在提供免费服务5年后,谷歌对外宣布将终止提供无限容量免费照片存储服务,转而只提供的15GB免费存储空间,超过部分就需要向谷歌付费。这一变化将于2021年6月1日生效,这意味着如果用户上传的照片超…

下载 沙耶之歌Android_沙耶之歌安卓版apk-沙耶之歌下载手机版v1.2-飘荡下载

一款超经典的日式ADV游戏,游戏中有着精致的动漫风格画风,并且讲述了一个非常重口味但又异常纯洁的恋爱故事,玩家将会扮演男主进行游戏,超级丰富精彩的剧情等你来体验,并且还有着不同的剧情选项可以选择,能否…

Maven,Eclipse和Java 9

任何在eclipse中使用M2E(maven-to-eclipse)插件的人都知道您在哪里运行构建的问题,然后在项目上更新maven只是让它重置JRE并抛出一堆项目错误! 我在使用Open Liberty与Java 9一起运行Java EE 8的帖子中注意到了这个问题 解决方案…

python变量持久化_Python 数据持久化:JSON

Python 数据持久化:JSON编程派微信号:codingpy淡蓝色字体可以直接点击查看上周更新的《Think Python 2e》第14章讲述了几种数据持久化的方式,包括dbm、pickle等,但是考虑到篇幅和读者等因素,并没有将各种方式都列全。本…

jwt配置 restful_SpringBoot实现JWT保护前后端分离RESTful API

本文将用不到100行Java代码, 教你如何在Spring Boot里面用JWT保护RESTful api.登录前登录之后即可得到正确结果登陆后1. 什么是JWT了解JWT的同学可以跳过这一部分废话少说, 我们先看看什么是JWT. JSON Web Token其实就是一个包含认证数据的JSON, 大概长这样子分三个部分,第一部…

fusion构建器代码语法_构建器模式:适用于代码,适用于测试

fusion构建器代码语法我发现构建器设计模式偶尔在代码中有用,但在测试中经常有用。 本文简要概述了该模式,然后介绍了在测试中使用该模式的一个有效示例。 请参阅github中的代码。 生成器模式的背景 根据GoF的书 ,构建器设计模式用于“将复杂…

6000毫安以上智能手机_三星超长续航神机,6000毫安+128GB,上市半年不到跌至1499...

现在的手机是越来越智能了,无论是苹果还是安卓,基本都能为用户的生活添加几分乐趣,因为,当我们感到无聊时,基本都可以通过智能手机来打发时间。据我所知,不少人在用智能手机时都有个困扰,就是续…