小编Sha*_*baz的帖子

ExecutorService令人惊讶的性能收支平衡点---经验法则?

我正在试图弄清楚如何正确使用Java的Executors.我意识到将任务提交给ExecutorService有自己的开销.但是,我很惊讶它看到它的高度.

我的程序需要以尽可能低的延迟处理大量数据(股票市场数据).大多数计算都是相当简单的算术运算.

我试着测试一些非常简单的东西:" Math.random() * Math.random()"

最简单的测试在一个简单的循环中运行这个计算.第二个测试在匿名Runnable中进行相同的计算(这应该衡量创建新对象的成本).第三测试传递Runnable到一个ExecutorService(在此测定引入执行人的成本).

我在我的小型笔记本电脑上运行测试(2 cpus,1.5 gig ram):

(in milliseconds)
simpleCompuation:47
computationWithObjCreation:62
computationWithObjCreationAndExecutors:422
Run Code Online (Sandbox Code Playgroud)

(大约四次运行中,前两个数字最终相等)

请注意,执行程序所花费的时间远远多于在单个线程上执行的时间.对于1到8之间的线程池大小,数字大致相同.

问题:我是否遗漏了一些明显的或者预期的结果?这些结果告诉我,我传递给执行程序的任何任务都必须进行一些非平凡的计算.如果我正在处理数百万条消息,并且我需要对每条消息执行非常简单(且便宜)的转换,我仍然可能无法使用执行程序...尝试在多个CPU之间传播计算可能最终会比仅仅更昂贵在一个线程中完成它们.设计决策变得比我原先想象的要复杂得多.有什么想法吗?


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ExecServicePerformance {

 private static int count = 100000;

 public static void main(String[] args) throws InterruptedException {

  //warmup
  simpleCompuation();
  computationWithObjCreation();
  computationWithObjCreationAndExecutors();

  long start = System.currentTimeMillis();
  simpleCompuation();
  long stop = System.currentTimeMillis();
  System.out.println("simpleCompuation:"+(stop-start));

  start = System.currentTimeMillis();
  computationWithObjCreation();
  stop = System.currentTimeMillis();
  System.out.println("computationWithObjCreation:"+(stop-start));

  start = System.currentTimeMillis();
  computationWithObjCreationAndExecutors();
  stop = System.currentTimeMillis();
  System.out.println("computationWithObjCreationAndExecutors:"+(stop-start)); …
Run Code Online (Sandbox Code Playgroud)

java performance executorservice

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

.NET有类似于Java的垃圾收集日志吗?

.NET有类似于Java的垃圾收集日志吗?我想将GC统计信息写入生产应用程序中的日志.谷歌没有告诉我任何有用的东西,所以似乎也没有任何相关的问题.

谢谢

.net c# logging garbage-collection

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

在运行时加载python代码

我想.py在运行时加载一个文件.该.py文件基本上是一个配置文件,格式如下:

var1=value  
var2=value  
predicate_function=func line : <return true or false>  
Run Code Online (Sandbox Code Playgroud)

加载此文件后,我希望能够访问var1,var2并且predicate_function.对于每一行,我将它传递给谓词函数,如果它返回false,我将忽略它.

无论如何,我不确定如何在运行时加载python文件并访问其变量.

澄清:可能有任何数量的这些配置文件需要传递给主程序,直到运行时我才会知道它们的名称.谷歌告诉我应该使用__import__.我不确定如何正确使用该方法,然后访问导入文件的变量.

python runtime python-import

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

Google App Engine沙盒如何运作?

Google App Engine沙盒如何运作?

我需要做些什么来创建我自己的沙箱(为了安全地允许我的客户在我的引擎上运行他们的应用程序而不让他们能够格式化我的磁盘驱动器)?它只是类加载器魔术,字节操作或什么?

java google-app-engine jvm sandbox

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

来自Console项目的WPF窗口?

我最近开始了一个C#项目(VS 2008),作为一个'Console'项目,我写了一些库,测试程序等.现在我想添加几个WPF窗口,但看起来控制台项目不会让我这样做.我来自Java所以这有点奇怪.如何添加WPF表单(我将从我的"主"类中实例化我的自我?

c# wpf console

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

linux的perf实用程序如何理解堆栈跟踪?

Brendan Gregg使用Linux的perf实用程序为c/c ++,jvm代码,nodejs代码等生成火焰图.

Linux内核本身是否了解堆栈跟踪?在哪里可以阅读更多关于工具如何能够反省到流程的堆栈跟踪,即使流程是用完全不同的语言编写的?

linux-kernel perf flamegraph

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

HawtDispatch与Java的Executors有何不同?(和netty)

令人沮丧的是,HawtDispatch的网站将其描述为"线程池和NIO事件通知框架API".

我们先来看一下'线程池'部分.Java提供的大多数Exec​​utor也基本上都是线程池.HawtDispatch有何不同?

它显然也是一个"NIO事件通知框架API".我假设它是顶层NIO上的一个薄层,它接收传入数据并传递给它的"线程池"概念,并在线程池调度程序找到时间时将其传递给使用者.正确?(欢迎对NIO进行任何改进).有没有人对netty和HD做过任何性能分析?

threadpool netty

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

如何在忽略.git,.gitignore等文件的情况下执行gsutil cp -R?

我正在尝试自动化使用Google云存储同步我的网络资源的过程.我基本上需要将开发目录中的所有内容复制到云端.但是,我需要忽略.git目录和其他一些不相关的文件.

我不能只做'gsutil cp -R.'因为这绝对是一切,包括.git.我试过'find.| fgrep git | gsutil cp -I',但这会使所有目录变平并将它们放在root中!

有没有办法可以用gsutil来解决这个问题,还是我必须在脚本中循环,用-R上传所有目录(.git除外),然后在当前目录中上传单个文件?

gsutil google-cloud-platform

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

在node.js中,如何将模块的所有事件转发到另一个

假设我正在创建自己的模块,它位于"网络"模块的顶部.我的模块有自己的事件,但也允许客户端侦听tcp连接发出的网络事件:

mymod.on('myevent',...); // my event
mymod.on('connect',...); // net event
mymod.on('end',...);     // net event
Run Code Online (Sandbox Code Playgroud)

现在我正在做以下事情

...
tcp.on('connect',function(){ self.emit('connect');});
tcp.on('end',function(){ self.emit('end');});
...
Run Code Online (Sandbox Code Playgroud)

我是否有更惯用的方式将所有事件(或事件的子集)从一个模块转发到另一个模块的客户端?

我希望这种情况一直都会出现,所以我想以最干净的方式做到这一点.

javascript node.js

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

如何将网络请求分派给(地理上)最近的服务器

我是一名Java编码员,对网络的工作方式不太熟悉(除了基本的UDP/TCP连接)

假设我在美国,亚洲,拉丁美洲和欧洲的机器上运行服务器.当用户请求服务时,我希望他们的请求转到最靠近他们的服务器.

我是否可以拥有一个地址:mycompany.com,并以某种方式将请求路由到相应的服务器?显然,当有人去cnn.com时,他们会从靠近他们的服务器上收到图片,视频等.坦率地说,我看不出它是如何运作的.

顺便说一句,我的服务器不提供网页服务,它们提供其他服务,例如股票市场数据......以防万一.

由于我是程序员,我很想知道如何在软件中做到这一点.由于这只是闲置的好奇心,指向商业产品或服务的指针对理解这个问题不是很有帮助:)

networking tcp latency load-balancing

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