这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.
我们假设:
我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.
理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.
我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.
我一直试图通过循环展开来优化一些极其性能关键的代码(一种快速排序算法,在蒙特卡罗模拟中被称为数百万次).这是我试图加速的内循环:
// Search for elements to swap.
while(myArray[++index1] < pivot) {}
while(pivot < myArray[--index2]) {}
Run Code Online (Sandbox Code Playgroud)
我尝试展开类似的东西:
while(true) {
if(myArray[++index1] < pivot) break;
if(myArray[++index1] < pivot) break;
// More unrolling
}
while(true) {
if(pivot < myArray[--index2]) break;
if(pivot < myArray[--index2]) break;
// More unrolling
}
Run Code Online (Sandbox Code Playgroud)
这完全没有区别所以我把它改成了更易读的形式.我曾经尝试过循环展开,但我有类似的经历.鉴于现代硬件上的分支预测器的质量,何时(如果有的话)循环展开仍然是一个有用的优化?
language-agnostic optimization performance micro-optimization
以下将替换ASCII控制字符(简写为[\x00-\x1F\x7F]):
my_string.replaceAll("\\p{Cntrl}", "?");
Run Code Online (Sandbox Code Playgroud)
以下内容将替换所有ASCII不可打印字符(简写[\p{Graph}\x20]),包括重音字符:
my_string.replaceAll("[^\\p{Print}]", "?");
Run Code Online (Sandbox Code Playgroud)
但是,它们都不适用于Unicode字符串.有没有人有一个很好的方法从unicode字符串中删除不可打印的字符?
我有一个字符串 A função,Ãugent在我需要更换字符像ç,ã,Ã空字符串.
如何只匹配那些非ASCII字符?
我正在使用一个功能
public static String matchAndReplaceNonEnglishChar(String tmpsrcdta)
{
String newsrcdta = null;
char array[] = Arrays.stringToCharArray(tmpsrcdta);
if (array == null)
return newsrcdta;
for (int i = 0; i < array.length; i++)
{
int nVal = (int)array[i];
boolean bISO = Character.isISOControl(array[i]); // Is character ISO control
boolean bIgnorable = Character.isIdentifierIgnorable(array[i]); // Is Ignorable identifier
// Remove tab and other unwanted characters..
if (nVal == 9 || bISO || bIgnorable) …Run Code Online (Sandbox Code Playgroud) 当我偶然发现这个名为JSpeed的项目 - Javascript优化时,我正在浏览Google Code.
我注意到优化的一个是改变i++以++i在for循环语句.
优化之前
for (i=0;i<1;i++) {}
for (var i = 0, j = 0; i < 1000000; i++, j++) {
if (i == 4) {
var tmp = i / 2;
}
if ((i % 2) == 0) {
var tmp = i / 2;
i++;
}
}
var arr = new Array(1000000);
for (i = 0; i < arr.length; i++) {}
Run Code Online (Sandbox Code Playgroud)
优化后
for(var i=0;i<1;++i){}
for(var i=0,j=0;i<1000000;++i,++j){if(i==4){var tmp=i>>1;}
if((i&1)==0){var tmp=i>>1;i++;}}
var arr=new Array(1000000);for(var …Run Code Online (Sandbox Code Playgroud) 在关于JVM基于char []实现字符串创建的方式的问题之后,我已经提到当char []被复制到新字符串的内部时不会发生迭代,因为最终会调用System.arraycopy,它使用诸如memcpy之类的函数在原生的,依赖于实现的级别(原始问题)复制所需的存储器.
我想亲自检查一下,所以我下载了Openjdk 7源代码并开始浏览它.我在OpenJDK C++源代码中找到了System.arraycopy的实现,在openjdx/hotspot/src/share/vm/oops/objArrayKlass.cpp:
if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
// elements are guaranteed to be subtypes, so no check necessary
bs->write_ref_array_pre(dst, length);
Copy::conjoint_oops_atomic(src, dst, length);
} else {
// slow case: need individual subtype checks
Run Code Online (Sandbox Code Playgroud)
如果元素不需要类型检查(例如原始数据类型数组的情况),则调用Copy :: conjoin_oops_atomic.
该Copy::conjoint_oops_atomic函数位于'copy.hpp'中:
// overloaded for UseCompressedOops
static void conjoint_oops_atomic(narrowOop* from, narrowOop* to, size_t count) {
assert(sizeof(narrowOop) == sizeof(jint), "this cast is wrong");
assert_params_ok(from, to, LogBytesPerInt);
pd_conjoint_jints_atomic((jint*)from, (jint*)to, count);
}
Run Code Online (Sandbox Code Playgroud)
现在我们依赖于平台,因为复制操作具有基于OS /体系结构的不同实现.我将以Windows为例.openjdk\hotspot\src\os_cpu\windows_x86\vm\copy_windows_x86.inline.hpp: …
我希望从字符串中删除所有不可打印的ascii字符,同时保留不可见的字符.我认为这会有效,因为空格,\n\r是不可见的字符,但不是不可打印的?基本上我得到一个带有 字符的字节数组,我不希望它们在其中.所以我试图将它转换为字符串,删除 字符再次使用它作为字节数组.
空间在我的代码中工作正常,但是现在\ r和\n不起作用.保留这些也是正确的正则表达式是什么?还是有更好的方式来做我正在做的事情?
public void write(byte[] bytes, int offset, int count) {
try {
String str = new String(bytes, "ASCII");
str2 = str.replaceAll("[^\\p{Print}\\t\\n]", "");
GraphicsTerminalActivity.sendOverSerial(str2.getBytes("ASCII"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我试过[^\x00-\x7F]这是ascii字符的范围....但是然后 符号仍然通过,很奇怪.
例如我有一个这样的字符串:abc123[*]xyz[#]098[~]f9e
[*] 、 [#] 和 [~] 代表 3 个不同的不可打印字符。如何在 Java 中用“X”替换它们?
坦率
我有一个包含文本,控制字符,数字,变音符号(德语)和其他utf8字符的字符串.
我想删除所有不是"语言的一部分"的utf8字符.特殊字符如(非完整列表)":/ \ßä,; \n\t"都应保留.
遗憾的是,stackoverflow删除了所有这些字符,因此我必须附加图片(链接).
有任何想法吗?非常感谢帮助!
PS:如果有人知道一个不会杀死那些特殊字符的粘贴服务,我会很乐意上传字符串..我只是找不到一个..
[编辑]:我认为正则表达式"\ P {Cc}"是我想要保留的所有字符.这个正则表达式是否可以反转,以便返回与此正则表达式不匹配的所有字符?
java ×6
optimization ×3
regex ×3
performance ×2
android ×1
c++ ×1
character ×1
increment ×1
javascript ×1
jvm ×1
openjdk ×1
replace ×1
string ×1
unicode ×1