小编dso*_*len的帖子

java optimization nitpick:在投射之前调用instanceof进行检查是否更快投出一些东西并让它抛出异常?

在任何人说什么之前我只是出于好奇而问这个问题; 我不打算根据这个答案做任何过早的优化.

我的问题是关于使用反射和铸造的速度.标准的说法是"反思很慢".我的问题是哪个部分确实很慢,为什么; 特别是在比较某事物是否是另一个实例的父母时.

我非常有信心只是将对象的类与另一个Class对象进行比较的速度与任何比较一样快,大概只是直接比较已经存储在Object状态中的单例对象; 但如果一个班级是另一个班级的父母呢?

我通常认为instanceof它与普通班级检查一样快,但今天我想到了它,似乎有些反思必须在"幕后" instanceof才能发挥作用.我在网上查了一下,发现有人说的instanceof很慢; 大概是因为比较物体的父母所需的反射?

这导致了下一个问题,如何只是铸造.如果我把某事物作为一个物体,那我就得不到了ClassCastException.但是如果将对象转换为自身的父对象,则不会发生这种情况.基本上我正在做一个instanceof电话,或逻辑到那个效果,当我在运行时进行演员表明我不是吗?我从来没有听到过任何人暗示过投射物体之前可能会很慢.不可否认,并非所有演员都是提供对象的父级,但很多演员都是父类.然而,从来没有人暗示这可能会很慢.

那是哪个呢.是instanceof真的没有那么慢?两者都instanceof投射到父类有点慢吗?或者有什么理由可以比instanceof电话更快地完成演员表?

java optimization casting instanceof

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

如何将标量存储在perl中的"引擎盖下"?

perl中的基本类型与大多数语言不同,类型是标量,数组,哈希(但显然不是子例程,而且,我猜它实际上只是带语法糖的标量引用).最奇怪的是最常见的数据类型:int,boolean,char,string,都属于基本数据类型"标量".似乎perl决定将标量视为字符串,布尔值或基于修改它的运算符的数字,这意味着标量本身在保存时实际上并未定义为"int"或"String".

这让我很好奇这些标量是如何存储在"引擎盖下"的,尤其是它对效率的影响(是的,我知道脚本语言会牺牲灵活性的效率,但是当灵活性问题时,它们仍然需要尽可能优化没有受到影响).我更容易存储数字65535(需要两个字节)然后字符串"65535",需要6个字节,因此认识到$ val = 65535存储一个int将允许我使用1/3的内存,在大型阵列中,这也意味着更少的缓存命中.

当然,它不仅限于节省内存.如果我知道期望什么类型的标量,有时我可以提供更重要的优化.例如,如果我有一个使用非常大的整数作为键的哈希值,那么如果我将键识别为int,那么查找值会快得多,允许一个简单的模数来创建我的哈希键,然后如果我必须运行更复杂的哈希值字符串上的逻辑,具有3倍的字节.

所以我想知道perl如何在引擎盖下处理这些标量.它是否将每个值存储为字符串,在标量始终用作int的情况下,牺牲额外的内存和常量将字符串转换为int的cpu成本?或者它是否有一些逻辑推断用于确定如何保存和操纵它的标量类型?

编辑:

TJD与perlguts相关联,这回答了我的一半问题.标量实际上存储为字符串,int(有符号,无符号,双精度)或指针.我并不太惊讶,我大多数人都期望这种行为发生在引擎盖下,尽管看到确切的类型很有意思.我打开这个问题,因为perlguts实际上是低级别的.然后告诉我存在5种数据类型,它没有指定perl如何在它们之间交替工作,即perl如何决定在保存标量时使用哪种SV类型以及它如何知道何时/如何投射.

perl

14
推荐指数
3
解决办法
501
查看次数

如何在命名空间中使用变量

我认为我对命名空间和/或静态变量有一个根本的误解.但我试过这个测试代码(手工输入,原谅错别字)

test.h:

namespace test{
   static int testNum=5;
   void setNum(int value);
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include <test.h>

int test::setNum(int value){
   testNum=value;
}

int main(){
    test::setNum(9);
    cout<<test::testNum;
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到的值是5,而不是我预期的9.看起来好像我有两个testNum变量的实例,但这似乎与静态应该做的完全相反.我猜我错误地认为这些功能与他们的java equovilants在某种程度上相同......

我还得到一个错误,指出如果我从testNum的声明中删除静态,则testNum被声明为多次,有人可以解释为什么会这样吗?

谢谢

c++ static namespaces

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

是否有一个尊重fetchSize的mysql JDBC?

我正在使用MySQL,并希望利用该setFetchSize属性.默认的MySQL JDBC实现并不真正尊重它.如果设置FETCHSIZE到Integer.MIN_VALUE会分别读取每一行,但考虑到我想使用的原因FETCHSIZE是,我有足够的数据来把我的内存使用量成是要永远拿去做每行一个查询2 G范围.

我想插入一个可以与MySQL一起工作的JDBC实现并正确地考虑获取大小,允许我设置一个10,000或其他更高限制的fetchsize.任何人都可以指向一个可能提供这种实现的jar吗?失败那是否有任何其他资源允许我合理地以有效的方式执行包含数万个条目的查询,但是在内存和所需的sql查询数量方面.

java mysql sql jdbc

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

添加到矢量而不复制结构数据

这可能是一个简单的C++问题,但我正在重新学习C++并且不了解一些基础知识.我有一个类,其中包含一个带有对象向量的结构,所以像这样:

struct my_struct{
    Irrelevant_Object object,
    vector<tuple> tuple_list;
}
Run Code Online (Sandbox Code Playgroud)

结构和元组(另一个结构)由体系结构预定义,并在我的方法中提供给我; 所以我无法改变它们.我想生成并将元组插入到原始空的tuple_list中.

简单的解决方案是有一个方法,它分配一个新的元组对象,填充元组数据,然后调用tuple_list.push_back()并传入分配的元组.但这需要分配一个新的元组,只是让push_back方法将(大)元组结构的所有内容复制到向量的已定义的内存空间中.所以我付出了分配/删除的费用以及将元组内容复制到向量中这样做的费用较低.它似乎相当无效,而且由于这种方法将处于函数的关键路径中,我更喜欢更快的东西(我很怀疑这种方法会不会出现瓶颈,我知道早期优化==坏.但是,我是更多地问这个问题是为了学习一些关于C++语法的东西,然后我需要在我的代码中实际执行此操作.

所以我的问题是,有没有更快的方法来填充我的元组列表的内容而不分配和复制元组?如果这是一个数组,我可以使数组尽可能大,然后通过对tuple_list [0]的引用到创建元组的函数.这样,函数可以填充数组中已分配的元组的空内容,而无需分配新元组或从一个元组复制到另一个元组.当我的itterator指向0x0时,我试图用矢量出于好奇并最终得到一个seg错误,所以我认为语法对矢量不起作用.那么有一个快速的方法来完成这项任务吗?

因为这是一个问题,学习语言和实际使用一样多,你可以自由地投入任何其他与你认为有趣的相关的东西,我想学习.

谢谢.

c++ vector

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

如何追捕内存泄漏valgrind说不存在?

我有一个程序接受来自套接字的数据,进行一些质量控制并对其进行各种其他调节,然后将其写入命名管道.我在上面运行valgrind并修复了最初存在的所有内存泄漏.然后我在一个系统上创建了一个'demo'环境,在这个系统中我运行了32个这个程序的实例,每个实例都输入了唯一的数据,每个数据输出到它自己的管道.我们对它进行了测试,一切看起来都很好.然后我尝试通过提高数据发送速率到荒谬的速度进行压力测试,事情看起来很好......但是我的程序在没有剩余资源之前一直在消耗越来越多的内存.

我转向valgrind并运行完全相同的设置,除了使用leak-check = full在valgrind中运行的每个程序.发生了一些奇怪的事情.首先,内存确实泄漏了,但只是到了每个程序耗尽的程度.我的内存占了9%(之前最大的内存占了我内存的6%).随着valgrind运行程序的CPU成本上升,我现在处于100%cpu且负载平均值很大,因此缺少可用的CPU可能会导致程序运行缓慢,泄漏时间太长而无法显示.当我尝试停止这些程序时,valgrind没有显示直接内存泄漏,它显示了一些潜在的内存泄漏,但我检查了它们,我不认为它们中的任何一个代表真正的内存泄漏; 此外,当程序消耗超过100 MB时,可能的内存泄漏仅显示为几千字节.valgrind报告的可达(非泄漏)内存也在KB范围内,因此valgrind似乎相信我的程序消耗的是Top所说的他们正在使用的内存的一小部分.

我已经进行了一些其他测试并获得了奇怪的结果.一个程序,甚至以我检测到的原始内存泄漏速率的三倍运行,似乎从不消耗超过.9%的内存,两个程序分别泄漏到1.9和1.3%的内存,但没有更多等等,就好像泄漏的内存量和泄漏的速率在某种程度上取决于我的程序一次运行多少个实例; 这没有任何意义,每个实例应该100%独立于其他实例.

我还发现如果我运行32个实例,只有一个实例在valgrind中运行valgrinded实例(如果我说它是一个单词!)泄漏内存,但速度比在valgrind之外运行的速度慢.valgrind实例仍然会说我没有直接泄漏,报告的内存消耗远低于Top显示.

我对于导致这个结果的原因感到很难过,为什么valgrind拒绝意识到内存泄漏.我认为它可能是一个外部库,但我并没有真正使用任何外部库; 只是基本的C++函数/对象.我还认为它可能是写入输出管道的数据快速导致缓冲区无限增长,但1)应该有一个上限,这样的缓冲区可以增长和2)一旦内存泄漏,如果我删除数据输入率没有任何记忆保持消耗,而是慢慢回落到合理的数量.

任何人都可以给我一个关于我应该从哪里看的提示吗?我完全难以理解为什么记忆以这种方式表现.

谢谢.

c++ valgrind memory-leaks memory-leak-detector

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

使用工作集时,eclipse的"开放资源"会变慢

我最近改变了我的"开放资源"屏幕的工作集,因为我因为我的maven配置而看到了同一文件的多个版本(子pom中的一个类会出现在子项目和父项目下).我使用了堆栈溢出问题的建议:

Eclipse Maven显示同一文件的多个路径

这确实有效.但是,当我尝试使用开放资源时,它也会导致明显的延迟.任何当前打开的资源都可以立即搜索,但如果资源尚未打开,我将需要等待相当长的时间才能填充资源.滞后比处理重复文件更糟糕.

有明显滞后的原因吗?我在资源有限的计算机上运行,​​特别是IO绑定,但是没有特定工作集的常规开放资源实际上是即时的.是否有一些缓存正在进行,如果可以,我可以使eclipse缓存工作集的资源吗?

java eclipse maven

6
推荐指数
0
解决办法
476
查看次数

java的cacerts格式应为哪种格式?

我对cacerts格式有些困惑。我最近使用的应用程序必须升级其cacerts文件。最初的cacerts文件为pk12格式(我认为是二进制文件),而新格式显然是pem。我可以使用任一个cacert,但是当我建议有人在身份验证升级到新的cacert时遇到问题时,他会抱怨,因为它不是pk12格式。

cacert应该是哪种文件格式?可以是任何一种格式吗?是否可以配置/定义应该使用的格式?

java ssl pki

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

迭代哈希引用是否需要在perl中隐式复制它?

假设我有一个大哈希,我想迭代它的内容.标准的习语是这样的:

while(($key, $value) = each(%{$hash_ref})){
   ///do something
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我理解我的perl,这实际上是做了两件事.首先是

%{$hash_ref}
Run Code Online (Sandbox Code Playgroud)

正在将ref翻译成列表上下文.因此返回类似的东西

(key1, value1, key2, value2, key3, value3 etc)
Run Code Online (Sandbox Code Playgroud)

它将存储在我的堆栈内存中.然后每个方法都会运行,在内存中使用前两个值(key1和value1)并将它们返回到我的while循环进行处理.

如果我对此的理解是正确的,这意味着我已经有效地将我的整个哈希复制到我的堆栈内存中,只是迭代新的副本,这对于大型哈希来说可能是昂贵的,因为迭代数组两次的费用,但是如果两个哈希值都不能同时保存在内存中,也会导致潜在的缓存命中.看起来效率很低.我想知道这是不是真的发生了,或者我是否误解了实际行为,或者编译器是否为我的效率低下了?

跟进问题,假设我对标准行为是正确的.

  1. 是否有一种语法可以避免通过在原始哈希中迭代它来复制哈希值?如果不是哈希那么更简单的数组呢?

  2. 这是否意味着在上面的示例中,如果我修改了循环中的hash_ref内容,我可能会在哈希副本和实际哈希值之间得到不一致的值; 导致$ value具有不同的值,然后$ hash_ref - >($ key)?

perl hash

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

!从Jetty 7切换到Jetty 9时出现asyncSupported异常

我们最近升级了我们的码头版本.当我们这样做时,我们的两个遗留的gui war文件,在一段时间内没有人修改过,停止正常工作.我相信我找到了代理的根本原因(用于代理另一个端口上的restful接口),对代理的任何调用都会抛出异常:

 IllegalStateException: !asyncSupported
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会出现这种情况,而不是旧的码头.我目前无法构建war文件,只有一个开发人员可以构建它是一个混乱,但是我使用jetty -x解压缩它并且对web.xml文件的servlet部分进行解压缩:

<async-supported>true</async-supported>
Run Code Online (Sandbox Code Playgroud)

然后使用jar c命令重新解压缩.这似乎没有帮助,虽然现在我在我的码头日志中得到例外情况,而他们只会在浏览器中显示.

任何人都可以告诉我如何激活异步支持和/或为什么jetty中的切换会导致这种情况?

java jetty war

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