相关疑难解决方法(0)

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

最后的性能优化策略

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

我们假设:

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

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

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

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

language-agnostic optimization performance

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

你最有争议的编程意见是什么?

这绝对是主观的,但我想尽量避免它变得有争议.我认为如果人们适当地对待它可能是一个有趣的问题.

对这个问题的想法来自评论跟帖从我的回答:"你恨你喜欢的语言什么的五件事?" 问题.我争辩说C#中的类应该默认密封 - 我不会把我的推理放在这个问题上,但我可以写一个更全面的解释作为这个问题的答案.我对评论中讨论的热度感到惊讶(目前有25条评论).

那么,持有什么有争议的意见?我宁愿避免那种以相对较少的基础(例如括号放置)而变得非常宗教的东西,但是例子可能包括诸如"单元测试实际上并不十分有用"或"公共领域真的很好"之类的东西.重要的是(对我来说,无论如何)是你有理由支持你的意见.

请提出您的意见和推理 - 我鼓励人们投票支持有争议和有趣的意见,无论您是否恰好同意这些意见.

language-agnostic

363
推荐指数
237
解决办法
29万
查看次数

在Object.assign或spread运算符上使用immutable.js的优点

到目前为止,大多数"起始锅炉板"和一些关于react/redux的帖子我都看到鼓励使用immutable.js来解决可变性问题.我个人依赖Object.assign或传播运算符来处理这个问题,因此在immutable.js中并没有真正看到优势,因为它增加了额外的学习,并且从用于可变性的vanilla js技术转移了一些.我试图找到切换的正当理由,但是因为我无法在这里询问为什么它如此受欢迎.

javascript immutability reactjs redux

28
推荐指数
2
解决办法
9110
查看次数

是否在C++跨平台应用程序中实现本地化文本的实践?

在当前的C++标准(C++ 03)中,关于文本本地化的规范太少,这使得C++开发人员在使用本地化文本时比以往更加艰难(当然,C++ 0x标准稍后会有所帮助).

假设以下场景(来自真正的PC-Mac游戏开发案例):

  1. 响应(实时)应用程序:应用程序必须将非响应时间最小化为"不明显",因此执行速度很重要.
  2. 本地化文本:显示的文本本地化为两种以上的语言,可能更多 - 不要指望固定数量的语言,应该易于扩展.
  3. 在运行时定义的语言:文本不应该在应用程序中编译(每种语言也没有一个应用程序),你在应用程序启动时获得所选的语言信息 - 这意味着某种文本加载.
  4. 跨平台:应用程序采用跨平台编码(Windows - Linux/Ubuntu - Mac/OSX),因此本地化文本系统也必须是跨平台的.
  5. 独立应用程序:应用程序提供运行它所需的所有内容; 它不会使用任何环境库或要求用户安装除操作系统之外的任何东西(例如大多数游戏).

在这种应用程序中,用C++管理本地化文本的最佳实践是什么?

去年我研究了这个,我唯一确定的是你应该使用std::wstringstd::basic_string<ABigEnoughType>操纵应用程序中的文本.我停止了我的研究,因为我的工作更多的"文本显示"的问题(在实时3D的情况下),但我想有管理的纯粹的C本地化的文本++不仅仅是这一点,"使用Unicode"的一些最佳做法.

所以,欢迎所有最佳实践,建议和信息(跨平台让我觉得很难)!

c++ localization

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

为什么String.equalsIgnoreCase太慢了

我在面试中遇到一个问题,即写一个方法来检查类似的单词而不考虑字符情况.

我通过使用每对字符的ASCII值的差异来回答它.但是在家里,当我在String.class中实际执行它时,我感到很不安 - 为什么这样实现呢!

我试图在inbuilt和我的自定义方法之间进行比较,这种方式 -

public class EqualsIgnoreCase {

    public static void main(String[] args) {
        String str1 = "Srimant @$ Sahu 959s";
        String str2 = "sriMaNt @$ sAhu 959s";

        System.out.println("Avg millisecs with inbuilt () - " + averageOfTenForInbuilt(str1, str2));
        System.out.println("\nAvg millisecs with custom () - " + averageOfTenForCustom(str1, str2));
    }

    public static int averageOfTenForInbuilt(String str1, String str2) {
        int avg = 0;
        for (int itr = 0; itr < 10; itr++) {
            long start1 = System.currentTimeMillis();
            for (int i …
Run Code Online (Sandbox Code Playgroud)

java string performance ignore-case

21
推荐指数
3
解决办法
5095
查看次数

何时使用Enum/Int常量

我有一个问题,我们何时应该使用Enum,何时应该使用最终常量?

我知道它已在Enums和Constants中讨论过.哪个用的?虽然这是C#问题.

我的问题是为什么Android使用这么多常量而不是Enum?例如, Context

在我看来,如果我们使用常量,可能存在以下风险:如果我们定义LEVEL常量

 public static final int LEVEL_LOW=1;
 public static final int LEVEL_MEDIUM=2;
 public static final int LEVEL_HIGH=3;
Run Code Online (Sandbox Code Playgroud)

当我们传递一个int = 4的参数时.它不会有编译错误,如果我们传递1的数字,代码阅读器可能不容易知道它的意思.

但Enum可以解决这个问题,虽然它可能会导致更多的开销,因为它是Object.

那么为什么Android使用常量而不是Enum?在这种情况下,我们何时应该使用常数或枚举?

java enums android constants

16
推荐指数
2
解决办法
5468
查看次数

PHP7中的foreach更改

foreach在PHP7中,默认情况下,按值迭代时,根据以下内容对数组的副本进行操作:http://php.net/manual/en/migration70.incompatible.php

是否只有在对数组或值进行更改时才会懒惰地创建副本,或者它是否总是复制并实质上使引用循环进行性能优化?

此外,对象数组是否仍然循环/给你对象的引用?或者他们实际上是否也会创建副本foreach并按值返回对象?

php foreach php-7

10
推荐指数
1
解决办法
4513
查看次数

C++ STL容器和就地构造

请考虑以下事项:

class CMyClass
{
public:
  CMyClass()
  {
    printf( "Constructor\n" );
  }
  CMyClass( const CMyClass& )
  {
    printf( "Copy constructor\n" );
  }
};

int main()
{
  std::list<CMyClass> listMyClass;

  listMyClass.resize( 1 );

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

构造函数

复制构造函数

现在我的问题是:我如何避免复制构造函数?或者换一种方式:如何在没有不必要的复制操作的情况下在STL容器内创建对象.有没有办法使用默认构造函数进行"就地"构造?


更新 - 答案到目前为止:

  1. 它无法完成
  2. 请改用指针或智能指针.

智能指针对我的应用来说太过分了.但我真的很想知道为什么不能这样做.这似乎是一件显而易见的事情.还有其他想法吗?如果它有效,我甚至会接受一个讨厌的黑客......


我想我刚从这里提出的所有评论和答案中找到了我的问题的解决方案.解决方案是构造一个空对象并将其保留,以便以后使用它来制作干净的副本.然后,您可以使用其中一个引用方法(如push_back或insert).这仍然为每个插入的新对象调用复制构造函数,但至少它不是默认构造函数和复制构造函数:

int main()
{
  CMyClass Empty;

  std::list<CMyClass> listMyClass;

  for ( int c=0; c<10; ++c )
  {
    listMyClass.push_back( Empty );
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ stl

8
推荐指数
1
解决办法
4826
查看次数

右移以执行除以2开-1

我知道我可以使用右移执行除以2.

为简单起见,采用4位数系统

-1 - 1111
-2 - 1110
-3 - 1101
-4 - 1100
-5 - 1011
-6 - 1010
-7 - 1001
-8 - 1000
7  - 0111
6  - 0110
5  - 0101
4  - 0100
3  - 0011
2  - 0010
1  - 0001
0  - 0000
Run Code Online (Sandbox Code Playgroud)

如果我尝试表演

6 / 2 = 0110 >> 1 = 0011 = 3
-6/ 2 = 1010 >> 1 = 1101 = -3
Run Code Online (Sandbox Code Playgroud)

对+ ve和-ve数都有效

但是,当来到1

1 / 2 = 0001 …
Run Code Online (Sandbox Code Playgroud)

java algorithm

7
推荐指数
3
解决办法
5639
查看次数