java字符串优化——就地加载算法

标签 java string optimization java-native-interface

我需要优化 csv 文件(字符串)的实际加载/解析。我知道的最好的方法是就地加载算法,我成功地使用 JNI 和 C++ dll 来使用它,直接从由解析的 csv 数据组成的文件加载数据。

如果它停在那里就好了,但使用该方案仅使其速度提高了 15%(不再解析数据)。它没有我最初想象的那么快的原因之一是因为 java 客户端使用 jstring,所以我需要再次将实际数据从 char* 转换为 jstring。

最好的方法是忽略该转换步骤并将数据直接加载到 jstring 对象中(不再进行转换)。因此,jstring 将直接指向内存块,而不是根据就地加载的数据复制数据(请注意,数据将由 jchars 而不是 chars 组成)。真正的坏事是我们需要确保垃圾收集器不会收集该数据(也许通过保留对它的引用?)但它应该是可行的..不是吗?

我认为我有两种选择:

1-在java中加载数据(不再是jni)并使用指向加载数据的字符来创建字符串..但我需要找到一种方法来防止在创建字符串时重复数据。

2- 继续使用 jni “手动”创建和设置 jstring 变量,并确保垃圾收集器选项设置正确,以防止它对其执行任何操作。例如:

jstring str; 
str.data = loadedinplacedata;  // assign data pointer
return str;

不确定这是否可能,但我不介意将 jstring 直接保存到文件中并像这样重新加载:

jstring * str = (jstring *)&loadedinplacedata[someoffset];
return * str;

我知道这不是通常的 Java 事情,但我很确定 Java 具有足够的可扩展性,能够做到这一点。而且我在这件事上并没有真正的选择……这个项目已经有 3 年历史了,它需要工作。 =S

这是 JNI 代码(C++):

const jchar * data = GetData(id, row, col); // get pointer of the string ends w/ \0
unsigned int len = wcslen( (wchar_t*)data );
// The best would be to prevent this function to duplicate the data.
jstring str = env->NewString( data, len ); 
return str;

注意:上面的代码通过使用 unicode 数据而不是 UTF8(NewString 而不是 NewStringUTF),使其速度提高了 20%(而不是 15%)。这表明,如果我可以删除该步骤或对其进行优化,我将获得相当好的性能提升。

最佳答案

我从未使用过 JNI,但是...让它返回一个实现 CharSequence 的自定义类以及其他一些接口(interface)(例如 Comparable< CharSequence >)而不是 String 是否有意义?这样看来您不太可能出现数据损坏问题。

关于java字符串优化——就地加载算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585441/

相关文章:

java - 通用返回值(java)

java - 泛型 : suggest correct syntax

sql - 优化最大值查询

SQL:选择属于排除类别的记录,这些记录仅属于排除类别

java - 使字符串的第一个字符小写的最有效方法?

java - nCipher 使用 KeySafe 在 java 中生成 AES key

java - 格式错误的 JSON : Unexpected '<' in Spring

c - 使用 sscanf 将带有括号和逗号的字符串拆分为更小的变量

c# - 用字符串中的单个字符修剪重复字符

c# - 巨大的字符串到 WinForm RichTextBox