我试图重现这里描述的一些处理器缓存效果.我知道Java是一个托管环境,这些例子不会完全翻译,但我遇到了一个奇怪的例子,我试图提炼出一个简单的例子来说明效果:
public static void main(String[] args) {
final int runs = 10;
final int steps = 1024 * 1024 * 1024;
for (int run = 0; run < runs; run++) {
final int[] a = new int[1];
long start = System.nanoTime();
for (int i = 0; i < steps; i++) {
a[0]++;
}
long stop = System.nanoTime();
long time = TimeUnit.MILLISECONDS.convert(stop - start, TimeUnit.NANOSECONDS);
System.out.printf("Time for loop# %2d: %5d ms\n", run, time);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Time for loop# …
Run Code Online (Sandbox Code Playgroud) 我用它SpringJUnit4ClassRunner
来编写集成测试.我也@DirtiesContext
用于测试,使背景处于破碎状态,并且工作得很好.
但是现在我有一个测试,它在静态初始化器中设置一个重要的SystemProperty,而后者又在Spring上下文中使用.当测试自行执行时,这也可以正常工作.但是当我使用其他测试运行测试时,Spring上下文已经创建了该属性集并被我的新测试重用.
如何在我的测试中强制重新创建Spring上下文,然后将使用更改的System Property?
是否有任何特定原因在API中使用Date类(例如,在员工出生日期字段中)而不是long或Long.
有一些关于这个的讨论: java-date-vs-calendar,但我想知道是否有任何理由使用Dates,当long(或Long)似乎更简单.
当然我会使用TimeZone和SimpleDateFormatter在GUI中解析和显示日期,也可能使用Calendar来执行操作,但我只关心这个问题中数据模型/ API中日期的存储和表示.
更新:我不选择Date的一个原因的例子是它是可变的.因此,如果我在API中公开Date,调用者可以调用setTime(long),这似乎违反了基本封装.对我而言,这似乎超过了使用Date提供的额外清晰度的好处,因为我可以调用long属性timeInMillisecondsSinceEpoch并将相同的信息传递给调用者.
如果我有包含许多重复字符串的大对象图,那么在序列化它们之前对字符串进行实际的()是否有好处呢?这会减少传输的数据量吗?字符串会在接收端共享指针吗?
我的猜测是在发送之前将对字符串进行去除,从而减小数据的大小,并且它们将全部由接收端上的相同对象表示,但它们实际上不会在接收端被实现.(意味着每个序列化'事务'上会创建一个新的字符串实例)
我正在尝试将有效的ISO 8601字符串转换为一致的格式,以便可以使用简单的字典顺序进行排序和搜索.
我的应用程序可以使用以下任何格式接收日期/时间,例如:
2015-02-05T02:05:17.000+00:00
2015-02-05T02:05:17+00:00
2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)
这些都代表相同的日期/时间,我想将它们全部转换为规范的存储形式,例如:
2015-02-05T02:05:17.000Z
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是使用从将ISO 8601兼容的String转换为java.util.Date的技术解析它们,然后转换回所需的字符串,但在处理不太精确的日期/时间时会出现故障,例如:
2015-02-05T02:05:17Z
2015-02-05T02:05Z
2015-02-05Z
2015-02Z
2015Z
Run Code Online (Sandbox Code Playgroud)
应该保留这些时代的不精确性.它们不应转换为:
2015-02-05T00:00:00.000Z
Run Code Online (Sandbox Code Playgroud)
我看过Java 8和Joda-Time,但他们似乎想把所有内容都视为特定的时间点,并且不能模拟不精确的性质或部分日期/时间.
更新:
使用Java 8,我可以这样做:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
System.out.println(dateTime.toString());
Run Code Online (Sandbox Code Playgroud)
这给了我:
2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)
这是我想要的,但是:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17.000+00:00");
System.out.println(dateTime.toString());
Run Code Online (Sandbox Code Playgroud)
也给了我:
2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)
请注意,java已经抛弃了毫秒精度.指定000与未指定任何内容相同,这似乎不太正确.
我有几乎非规范化的现有表.事物列表状态,类型,国家等没有查找表...这个原始设计只是为了简化应用程序对数据库的访问,因此这种非规范化没有性能原因.
这导致了包含大量重复数据的表格,我想通过为各种状态/类型/国家/地区列引入查找表来正确规范化.
是否有一些我可以在数据库(oracle)中做到这一点,对客户端保持透明?应用程序将继续执行插入操作,但数据库会将事物映射到幕后的正确查找表.
我一直在尝试使用可以进行映射的视图和触发器的组合,但感觉应该有更自动的方法来执行此操作.