我们正在开发一个对延迟敏感的应用程序,并已对所有类型的方法进行微基准测试(使用jmh).在对查找方法进行微基准测试并对结果感到满意之后,我实现了最终版本,但却发现最终版本比我刚刚基准测试的版本慢了3倍.
罪魁祸首是实现的方法返回一个enum对象而不是一个int.以下是基准代码的简化版本:
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class ReturnEnumObjectVersusPrimitiveBenchmark {
enum Category {
CATEGORY1,
CATEGORY2,
}
@Param( {"3", "2", "1" })
String value;
int param;
@Setup
public void setUp() {
param = Integer.parseInt(value);
}
@Benchmark
public int benchmarkReturnOrdinal() {
if (param < 2) {
return Category.CATEGORY1.ordinal();
}
return Category.CATEGORY2.ordinal();
}
@Benchmark
public Category benchmarkReturnReference() {
if (param < 2) {
return Category.CATEGORY1;
}
return Category.CATEGORY2;
}
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 在.NET桌面应用程序和Java服务器之间的原型通信中,使用带有JSON帖子的REST,我遇到了一个区分大小写的问题..NET对象在Pascal Casing中具有属性(这是.NET的常规属性),例如: Symbol, EntryValue(etc),而同一对象的Java表示使用驼峰外壳,例如symbol, entryValue.
服务器接收json值为:
{"EntrySize":100,"Symbol":"AMZN"}
Run Code Online (Sandbox Code Playgroud)
但Gson不会以不区分大小写的方式反序列化.有没有办法让Gson这样做?
我们在服务器上使用jstack来检测java应用程序是否正在陷入僵局.它不适用于我们的Linux服务器之一.我认为O/S版本是:
$cat /etc/issue.net
Red Hat Enterprise Linux Server release 5.6 (Tikanga)
Kernel \r on an \m
Run Code Online (Sandbox Code Playgroud)
在服务器上运行的Java版本:
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)
当我尝试:
jstack 19114
Run Code Online (Sandbox Code Playgroud)
我明白了:
19114: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
Run Code Online (Sandbox Code Playgroud)
当我尝试:
jstack -F 19114
Run Code Online (Sandbox Code Playgroud)
我明白了:
Attaching to process ID 19114, please wait...
Debugger …Run Code Online (Sandbox Code Playgroud) 我们的应用程序中有一个相当常见的模式.我们在Xml中配置一个对象的集合(或列表),它们都实现了一个公共接口.在启动时,应用程序读取Xml并使用JAXB创建/配置对象列表.我从来没有想过(经过多次阅读各种帖子后)只使用JAXB的"正确方法".
例如,我们有一个接口Fee,以及多个具体的实现类,它们具有一些共同的属性,以及一些不同的属性和非常不同的行为.我们用来配置应用程序使用的费用列表的Xml是:
<fees>
<fee type="Commission" name="commission" rate="0.000125" />
<fee type="FINRAPerShare" name="FINRA" rate="0.000119" />
<fee type="SEC" name="SEC" rate="0.0000224" />
<fee type="Route" name="ROUTES">
<routes>
<route>
<name>NYSE</name>
<rates>
<billing code="2" rate="-.0014" normalized="A" />
<billing code="1" rate=".0029" normalized="R" />
</rates>
</route>
</routes>
...
</fee>
</fees>
Run Code Online (Sandbox Code Playgroud)
在上面的Xml中,每个<fee>元素对应于Fee接口的具体子类.该type属性提供有关要实例化的类型的信息,然后一旦实例化,JAXB解组将应用剩余Xml中的属性.
我总是不得不采取这样的行动:
private void addFees(TradeFeeCalculator calculator) throws Exception {
NodeList feeElements = configDocument.getElementsByTagName("fee");
for (int i = 0; i < feeElements.getLength(); i++) {
Element feeElement = (Element) feeElements.item(i);
TradeFee fee = createFee(feeElement);
calculator.add(fee); …Run Code Online (Sandbox Code Playgroud) 作为这个问题的前言,我不得不说我是一名Java程序员,因此更习惯于使用Java中的Maps而不是C++语义.在Java中,它很常见,并且null在Map中查找键时会返回.我正在将一些代码翻译成c ++,并尝试在与unordered_map交互时找到c ++的处理方式.
具体来说,我有一个包含unordered_map的类.我没有将映射直接暴露给客户端代码,而是有2个包装函数,一个用于将键/值对放入映射,另一个用于检索指定键的值,即:
void set_tag_value(string tag, string value);
string& get_tag_value(string tag);
Run Code Online (Sandbox Code Playgroud)
如果我unordered_map.at()用来检索值,那么它将抛出我的代码需要捕获的异常,或者允许它传播到客户端代码.(尽管如此,传播例外似乎对我不友好).
也许另一种方法是将返回值更改为string*类型,如果未找到则返回NULL(这是Java的方式),但是用户需要检查NULL(这也不是那么友好).
所以我的问题有两个部分:
什么是开发人员友好的方式来处理失败的查找,什么返回值将是有用的(异常,NULL,空字符串,或其他)?
在我的代码中,当您期望它可能找不到键,at()和catch异常,或者查找并检查iterator == map.end()时,哪个map up up方法更常用?(这部分问题是我只是想学习c ++的做事方式).
谢谢你的建议!
我们的生产应用程序在无法建立TCP/IP连接时记录错误.由于它不断重试连接,因此会反复记录相同的错误消息.类似地,如果某些实时资源在一段时间内不可用,则应用程序中的其他运行组件可能会进入错误循环.
是否有任何标准方法来控制记录相同错误的次数?(我们正在使用log4j,所以如果有log4j的任何扩展来处理它,那将是完美的.)
我们的应用程序是通过Java中的TCP/IP套接字快速读取数据.我们正在使用带有非阻塞套接字和选择器的NIO库来指示读取的准备情况.平均而言,读取和处理读取数据的总处理时间是亚毫秒.然而,我们经常看到10-20毫秒的尖峰.(在Linux上运行).
使用tcpdump,我们可以看到tcpdump读取2条谨慎消息之间的时差,并将其与我们的应用程序时间进行比较.我们看到tcpdump似乎没有延迟,而应用程序可以显示20毫秒.
我们非常确定这不是GC,因为GC日志几乎没有显示Full GC,而且在JDK 6中(根据我的理解),默认GC是并行的,所以它不应该暂停应用程序线程(除非执行Full GC) .
它几乎看起来像Java的Selector.select(0)方法有一些延迟返回准备读取,因为在TCP层,数据已经可以读取(并且tcpdump正在读取它).
附加信息:在峰值负载时,我们每条消息处理大约6,000 x 150字节平均值,或每秒大约900 MB.
我们一直在分析和分析我们的应用程序,以尽可能减少延迟.我们的应用程序由3个独立的Java进程组成,它们都运行在同一台服务器上,它们通过TCP/IP套接字相互传递消息.
我们将第一个组件的处理时间缩短到25μs,但我们发现TCP/IP套接字(在本地主机上)写入下一个组件总是需要大约50μs.我们看到另一个异常行为,因为接受连接的组件可以写得更快(即<50μs).目前,除套接字通信外,所有组件的运行时间均小于100μs.
不是TCP/IP专家,我不知道可以做些什么来加快这个速度.Unix Domain Sockets会更快吗?MemoryMappedFiles?什么其他机制可能是一种更快的方式将数据从一个Java进程传递到另一个Java进程?
更新6/21/2011我们创建了2个基准测试应用程序,一个用Java编写,一个用C++编写,用于更紧密地比较TCP/IP并进行比较.Java应用程序使用NIO(阻塞模式),而C++使用Boost ASIO tcp库.结果或多或少相当,C++应用程序比Java快约4μs(但在其中一项测试中,Java胜过C++).此外,两个版本的每条消息的时间都有很多变化.
我认为我们同意共享内存实现最快的基本结论.(虽然我们也想评估Informatica产品,只要它符合预算.)
我们正在开发一个应用程序,通过接收来自3个不同来源的消息,可以影响一组对象.每条消息(来自任何来源)都有一个对象作为其目标.每个消息接收器将在其自己的线程上运行.
我们希望消息的处理(在接收之后)尽可能高速,因此针对目标对象的消息处理将使用来自线程池的另一个线程来完成.消息的处理将比从发送者读取/接收消息花费更长的时间.
我认为如果池中的每个线程仅专用于特定的一组对象,它会更快,例如:
Thread1 -> objects named A-L
Thread2 -> objects named M-Z
Run Code Online (Sandbox Code Playgroud)
每组对象(或线程)都有一个专用的消息队列待处理.
我的假设是,如果所需的唯一线程同步是在每个接收线程和一个处理线程之间,在需要将消息放入阻塞队列的持续时间内,它将比随机分配工作线程以处理更快消息(在这种情况下,可能有2个不同的线程与同一对象的消息).
我的问题实际上是两个部分:
人们是否同意将工作线程专用于特定对象集合是更好/更快的方法?
假设这是一种更好的方法,现有的Java ThreadPool类是否有办法支持这种方法?或者它是否要求我们编写自己的ThreadPool实现?
感谢您提供的任何建议.
我正在使用TDD,并且有一个非常典型的编码模式,在我对单元测试进行编码时使用Eclipse自动创建方法和字段.例如:
类型名称不存在的方法,例如:
myObj.setValue(someValue);
单击IDE中的小红色错误标记以创建"setValue"方法.
在setValue方法内输入:
public void setValue(String value) {
this.value = value;
}
单击红色错误标记以自动创建私有字段(在本例中称为"值");
所以在这一点上,我希望Eclipse自动创建getter方法,而不必使用source - > generate getters和setters菜单.
我看到了这个问题:当你没有自动执行时,你如何强制Eclipse提示你创建一个getter和setter,这似乎意味着Eclipse 会这样做,但我找不到配置它的位置.
是否有一些方法可以将Eclipse配置为在添加新的私有变量时自动添加setter/getter?
更新:为了进一步澄清,我正在寻找像我在Spring Roo文档中看到的那样的东西.如果您查看"工作原理"部分,它将描述每当您添加私有变量时框架如何自动向您的类添加其他方法.(我的偏好不是为了运行这样的另一个过程,也不是为了得到它似乎添加的所有瑕疵).我希望Eclipse有类似的东西.