小编pan*_*ajt的帖子

为什么多线程似乎没有加速我的Web应用程序?

class ApplicationContext{
    private final NetworkObject networkObject = new networkObject();

    public ApplicationContext(){
      networkObject.setHost("host");
      networkObject.setParams("param");
    }

    public searchObjects(ObjectType objType){
        networkObject.doSearch(buildQuery(objType));
    }
}

class NetworkObject{
    private final SearchObject searchObject = new SearchObject();

    public doSearch(SearchQuery searchQuery){
        searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑运行Web应用程序的Web服务器,该Web应用程序仅创建一个ApplicationContext实例(单例)并使用相同的applicationInstance来调用searchObjects,例如

 ApplicationContext appInstance = 
                  ApplicationContextFactory.Instance(); //singleton
Run Code Online (Sandbox Code Playgroud)

每个对网页的新请求都说"search.jsp"会拨打电话

 appInstance.searchObjects(objectType);
Run Code Online (Sandbox Code Playgroud)

我正在向'search.jsp'页面发出1000个请求.所有线程都使用相同的ApplicationContext实例,而searchObject.search()方法需要15秒才能返回.我的问题是当一个人已经在执行searchObject.search()函数或所有线程同时执行searchObject.search()时,所有其他线程是否等待轮到他们执行(15秒),为什么?

我希望我的问题非常明确?

更新: 感谢大家澄清我的疑问.这是我的第二个问题,当我这样做时应该观察到性能的差异:

public synchronized doSearch(SearchQuery searchQuery){
    searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
Run Code Online (Sandbox Code Playgroud)

要么

public doSearch(SearchQuery searchQuery){
    searchObject.search(searchQuery); //threadsafe, takes 15(s) to return
}
Run Code Online (Sandbox Code Playgroud)

我相信使用没有synchronized关键字的'doSearch'功能应该可以提供更多性能.但是,当我今天测试它时,结果却出现了另一种情况.当我使用synchronized关键字时,性能相似或有时更好.

谁能解释这种行为.我应该如何调试这种情况.

问候,

佩里

java performance multithreading

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

在运算符重载中返回引用的重要性是什么?

任何人都可以解释为什么在重载运算符时需要返回引用,例如

friend std::ostream& operator<< (std::ostream& out, const std::string& str)
Run Code Online (Sandbox Code Playgroud)

c++

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

开关案例编程实践

enum SQLErrorCode{
      OK = 0,
      PARTIAL_OK = 1,
      SOMEWHAT_OK = 2,
      NOT_OK = 3,
};
Run Code Online (Sandbox Code Playgroud)

代码1:

int error = getErrorCode();
if((error == SQLErrorCode.PARTIAL_OK) ||
  (error == SQLErrorCode.SOMEWHAT_OK) ||
  (error == SQLErrorCode.NOT_OK) ||
  (error < 0))
   callFunction1();
else
    callFunction2();
Run Code Online (Sandbox Code Playgroud)

代码2:

switch(error){
       case SQLErrorCode.PARTIAL_OK: 
                                    callFunction1();
                                    break;
        case SQLErrorCode.SOMEWHAT_OK:
                                    callFunction1();
                                    break;
        case SQLErrorCode.NOT_OK: 
                                    callFunction1();
                                    break;
        default:
                                    callFunction2();
                                    break;
}
Run Code Online (Sandbox Code Playgroud)

我应该选择哪种方法.就性能而言,应该没有太大差异.如何在switch case中处理错误<0条件.

编辑:乔尔的解决方案:

switch(error) {
     case SQLErrorCode.PARTIAL_OK: 
     case SQLErrorCode.SOMEWHAT_OK:
     case SQLErrorCode.NOT_OK: 
         callFunction1();
         break;
     case SQLErrorCode.OK:
         callFunction2();
         break;
     default:     // error < 0 is handled …
Run Code Online (Sandbox Code Playgroud)

c c# c++ if-statement switch-statement

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

如何在日志文件中记录密码?

有两种方法可以记录任何密码 - 我没有看到任何一个密码有任何问题.

1. Not log any password, just log the user.
2. Log '******' against the password. logger.info("User=" + user + "logged with Password=******");
Run Code Online (Sandbox Code Playgroud)

我们对这些情况有什么最佳做法吗?

authentication logging

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

CPU利用率

Q1.编写不消耗CPU但仍能获得出色性能的代码的最佳实践是什么?这个问题非常通用.我在这里寻求的是列出用于不同环境的不同实践?除了进程监视器/任务管理器之外的调试技巧

编辑:我不是在谈论IO绑定进程.我说的是CPU绑定过程.但是,在这里我不希望我的进程继续占用CPU.如果我有一台4核机器,并且如果我在一个过程中运行四个简单的循环,则CPU消耗量最多可达到400%,直到应用程序/进程运行.

我在这里寻求一些关于这个话题的经验,每个人都会遇到一些时间或其他.例如,一旦应用程序在Windows上占用CPU,我就会调试它,因为它不断循环搜索不存在的文件.

如何以两种不同的CPU绑定应用程序顺利运行(给出良好响应)的方式编写程序?

更新: 建议:

  1. 写好干净的代码,然后配置您的应用程序,然后进行优化.(感谢提示)

  2. 重写/重新设计/重构代码比分析和修复代码更容易.

  3. 使用分析器调试您的应用程序

  4. 对于长时间等待的线程,请勿使用自旋锁

  5. 算法选择

这些建议对初学者理解概念有很大帮助.

performance cpu-usage cpu-speed

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

C++中的编码实践,您的选择是什么?为什么?

我有一个大对象说MyApplicationContext,它保存有关MyApplication的信息,如名称,路径,loginInformation,描述,详细信息等.

// MyApplicationCtx

class MyApplicationCtx{
       // ....
    private:
        std::string name;
        std::string path;
        std::string desciption;
        struct loginInformation loginInfo;
        int appVersion;
        std::string appPresident;
        //others
}
Run Code Online (Sandbox Code Playgroud)

这是我的方法cloneApplication(),它实际上设置了一个新的应用程序.有两种方法可以实现,如代码1和代码2所示.我应该选择哪一种?为什么?

//代码1

public void cloneApplication(MyApplicationCtx appObj){
    setAppName(appObj);
    setAppPath(appObj);
    setAppAddress(&appObj); // Note this address is passed
    setAppDescription(appObj);
    setAppLoginInformation(appObj);
    setAppVersion(appObj);
    setAppPresident(appObj);
}

public void setAppLoginInformation(MyApplicationCtx appObj){
    this->loginInfo = appObj.loginInfo; //assume it is correct
}

public void setAppAddress(MyApplicationCtx *appObj){
    this->address = appObj->address;
}

 .... // same way other setAppXXX(appObj) methods are called.
Run Code Online (Sandbox Code Playgroud)

Q1.每次传递大对象appObj都会对性能产生影响吗?

Q2.如果我使用引用传递它,那么对性能的影响应该是什么?

public void setAppLoginInformation(MyApplicationCtx &appObj){ …
Run Code Online (Sandbox Code Playgroud)

c++ coding-style

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

我该如何处理C++中的不一致对象?

说,我想创建一个File类

class File{
    public:
          File(const char *file){
               openFile(file);
          }
          ~File();
          isEmpty();
};
Run Code Online (Sandbox Code Playgroud)

openFile检查文件是否存在或文件内容是否有效.

File *file = new File("filepath");
if(file)
file->isEmpty();
Run Code Online (Sandbox Code Playgroud)

如果我的文件路径是正确的,那么所有正常的文件实例都是正确的,我们可以调用file->isEmpty(); 该文件不存在的内容,在这种情况下,检查结果仍为if(file)true,并将导致创建实际上无效的文件实例.如何保证如果文件路径无效,则文件实例应为null.

c++

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

这是一个设计缺陷吗?

考虑两个班级

class A{
     public:
       A(){
       }
       ~A(){
       }
};


class AImpl : public A{
      public:
         AImpl(){
             a = new AInternal();
         }
         AImpl(AInternal *a){
             this->_a = a;
         }
         ~AImpl(){
             if(a){
                delete a;
                a = null;
             }
         }
       private:
             AInternal *a;
};
Run Code Online (Sandbox Code Playgroud)

我试图隐藏AInternal的实现并只暴露A的接口.我在这里看到两件事

  1. A级完全是空的.
  2. 隐藏基本上是通过继承来实现的.我必须实际使用从A到AImpl的向下转换和向上转换,反之亦然.

这是一个很好的设计.由于缺乏设计经验,我看不出它的缺陷以及它为什么不好?

c++ design-patterns

0
推荐指数
1
解决办法
493
查看次数