我有一个短暂的客户端进程,它通过 SSL 与服务器通信。该进程被频繁调用,并且仅运行很短的时间(通常小于 1 秒)。此进程旨在用作用于执行较大任务的 shell 脚本的一部分,并且可能会被频繁调用。
在我的测试中,它每次启动时执行的 SSL 握手都显示为一个重要的性能瓶颈,如果可能的话,我希望减少它。
我想到的一件事是获取会话 ID 并将其存储在某个地方(有点像 cookie),然后在下一次调用时重新使用它,但这让我感到不安,因为我认为会有一些安全问题围绕做这件事。
所以,我有几个问题,
基本上,我正在传递一个字符串,我需要以与命令行选项由*nix shell标记的方式相同的方式对其进行标记.
说我有以下字符串
"Hello\" World" "Hello Universe" Hi
Run Code Online (Sandbox Code Playgroud)
我怎么能把它变成3元素列表
以下是我的第一次尝试,但它有很多问题
码:
public void test() {
String str = "\"Hello\\\" World\" \"Hello Universe\" Hi";
List<String> list = split(str);
}
public static List<String> split(String str) {
Pattern pattern = Pattern.compile(
"\"[^\"]*\"" + /* double quoted token*/
"|'[^']*'" + /*single quoted token*/
"|[A-Za-z']+" /*everything else*/
);
List<String> opts = new ArrayList<String>();
Scanner scanner = new Scanner(str).useDelimiter(pattern);
String token;
while ((token = scanner.findInLine(pattern)) != null) {
opts.add(token);
}
return …Run Code Online (Sandbox Code Playgroud) 假设我有一个用户定义的类型:
CREATE OR REPLACE TYPE TEST_TYPE AS OBJECT
(
f1 varchar2(10),
f2 number(5)
);
Run Code Online (Sandbox Code Playgroud)
现在,我想创建一个表来保存这些类型.我可以做以下事情:
create table test_type_table (
test_type_field test_type
);
Run Code Online (Sandbox Code Playgroud)
这给了我一个包含一列的表格test_type_field.
是否有一种简单而自动的方式来创建一个表,使其具有2列,f1并且f2?所以它是写作的等价物:
create table test_type_table (
f1 varchar2(10),
f2 number(5)
);
Run Code Online (Sandbox Code Playgroud) 我们有一个合理大小的C++应用程序,在这个阶段已经很老了,所以它有一些怪癖.
其中一个怪癖是它如何处理使用预标准化标准库的C++编译器.有一个头文件可以解决符合标准的编译器和这个不兼容的编译器之间的任何差异.由于各种原因,我们不能/不想停止支持这个编译器.
#include <vector>
#include <set>
#if defined(NO_STD_LIB)
#include <iostream.h>
#else
#incude <iostream>
using std::string;
using std::cout;
using std::vector;
using std::cout;
#endif
Run Code Online (Sandbox Code Playgroud)
你使用如下
#include stl.h
int main() {
vector<string> foo;
.....
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这种方法有两个主要问题:
作为代码清理项目的一部分,我真的想解决这两点.第一个确实是这样做的更重要的原因.
因为我们必须支持这个旧的编译器,所以我们的代码总是要避免将名称与它在标准库中公开的东西冲突,所以第2点并不真正相关,尽管我希望看到一个解决方案,当/如果我们最终可以放弃对它的支持.
到目前为止,我的想法是将超级标题分解为一组较小的标题.例如stl_vector,stl_iostream,stl_set等.这样我们只能包含我们感兴趣的标准库的部分.这些文件名遵循std头的模式,但有一个容易搜索的前缀.因此,当需要转储有问题的编译器时,搜索前缀并将其删除会很简单.
我认为这将很容易解决问题1.
我真正的问题是解决问题2.我想做这样的事情
#if defined(NO_STD_LIB)
#include <iostream.h>
#define std
#else
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
然后我们可以编码如下:
#incude "stl_iostream"
int main() {
std::string foo("bar");
std::cout << foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这几乎奏效了.没有标准命名空间的地方#define std使std :: string分解成:: string,生活很好.
然后我尝试使用.cc文件,该文件使用了可怕的"using namespace std;" 我得到一个编译错误,因为它变成"使用命名空间",所以这显然是行不通的.
现在显然我可以禁止人们编写"using namespace std;",但是尽管它应该在头文件中避免,但它有时在.cc文件中很有用,你们正在大量使用大量的STL类.
所以,最后,问题.是否存在处理此问题的标准习惯用法.或者,如果没有标准的方法来处理这个问题,那么你使用什么技巧来支持使用预标准标准库的编译器.
我曾经想过使用预编译的头来解决编译速度问题,但是我们针对不同的编译器,并且努力让它们在所有这些编译器中工作可能意味着它不值得花时间去做.
建议我放弃不合格编译器的答案可能很受欢迎,但不会被接受,因为这是我们现在不能做的事情.
在Java中:哪个是性能最高的代码,为什么?
if (x==1) {
....
} else if (x==2) {
....
} else if (x==3) {
....
} else if (x==4) {
....
}
... rest code here...
or
try {
if (x==1) {
...
throw MyException(1);
}
if (x==2) {
...
throw MyException(2);
}
if (x==3) {
...
throw MyException(3);
}
if (x==4) {
...
throw MyException(4);
}
} catch(MyException MEx) {
... rest code here ...
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!