相关疑难解决方法(0)

最后的性能优化策略

这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.

我们假设:

  • 代码已经正常工作
  • 所选择的算法对于问题的情况已经是最佳的
  • 已经测量了代码,并且已经隔离了违规的例程
  • 所有优化尝试也将被测量,以确保它们不会使事情变得更糟

我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.

理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.

我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.

language-agnostic optimization performance

600
推荐指数
28
解决办法
8万
查看次数

什么时候,如果循环展开仍然有用?

我一直试图通过循环展开来优化一些极其性能关键的代码(一种快速排序算法,在蒙特卡罗模拟中被称为数百万次).这是我试图加速的内循环:

// 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

88
推荐指数
3
解决办法
4万
查看次数

如何在Java中替换不可打印的Unicode字符?

以下将替换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字符串中删除不可打印的字符?

java string unicode

78
推荐指数
4
解决办法
12万
查看次数

从字符串中替换非ASCII字符

我有一个字符串 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)

java regex

67
推荐指数
3
解决办法
11万
查看次数

后增量与预增量 - Javascript优化

当我偶然发现这个名为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)

javascript optimization increment

34
推荐指数
3
解决办法
3万
查看次数

OpenJDK实现System.arraycopy

在关于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: …

c++ java openjdk jvm

9
推荐指数
1
解决办法
2447
查看次数

正则表达式删除所有不可打印的字符

我希望从字符串中删除所有不可打印的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字符的范围....但是然后 符号仍然通过,很奇怪.

java regex android

7
推荐指数
1
解决办法
2万
查看次数

如何使用 Java 检测和替换字符串中的不可打印字符?

例如我有一个这样的字符串:abc123[*]xyz[#]098[~]f9e

[*] 、 [#] 和 [~] 代表 3 个不同的不可打印字符。如何在 Java 中用“X”替换它们?

坦率

java replace character non-printable

5
推荐指数
1
解决办法
6793
查看次数

从String中删除除控制符之外的不可打印的utf8字符

我有一个包含文本,控制字符,数字,变音符号(德语)和其他utf8字符的字符串.

我想删除所有不是"语言的一部分"的utf8字符.特殊字符如(非完整列表)":/ \ßä,; \n\t"都应保留.

遗憾的是,stackoverflow删除了所有这些字符,因此我必须附加图片(链接).

有任何想法吗?非常感谢帮助!

PS:如果有人知道一个不会杀死那些特殊字符的粘贴服务,我会很乐意上传字符串..我只是找不到一个..

[编辑]:我认为正则表达式"\ P {Cc}"是我想要保留的所有字符.这个正则表达式是否可以反转,以便返回与此正则表达式不匹配的所有字符?

java regex non-printing-characters

5
推荐指数
1
解决办法
9574
查看次数