更新
在整个评论中,结果证明我采用的基准测试方法是不正确的,因此结果具有误导性。在纠正我的方法后(如接受的答案),结果正如人们所期望的 - JDK 13 的性能与 JDK 11 一样好。有关更多详细信息,请参阅答案。
原始问题
我在 Windows 10 下对 HashSet 进行了一些性能基准测试,使用以下 JMH 测试代码:
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1, warmups = 1)
public void init() {
HashSet<String> s = new HashSet<>();
for (int i = 0; i < 1000000; i++) {
s.add(Math.random() + "");
}
s.size();
}
Run Code Online (Sandbox Code Playgroud)
我在不同的 JDK 版本下编译并运行它,这是我得到的结果:
我也用不同的堆大小对其进行了测试(因此每个 JDK 有 3 种不同的颜色)。JDK 14 当然是今天的预发布快照——只是为了看看 ZGC 在 Windows 下的表现。
我想知道 - JDK 11 之后发生了什么?(注意,对于 JDK 12,它已经开始增长,即使它没有出现在上面的图表中)
我与QTcpSocket
. 我需要对套接字的任何写/读调用同步(阻塞)。
我知道有waitForReadyRead()
和waitForBytesWritten()
,但是这两种方法在 Qt 文档中被标记,因为它们在 Windows 下可能会随机失败。我受不了这个。
阻塞读取是最重要的(因为读取总是在向另一个对等方写入命令之后进行,所以我知道如果数据到达另一个对等方,它会回答)。
我尝试了 2 种方法。
第一的:
QByteArray readBytes(qint64 count)
{
int sleepIterations = 0;
QByteArray resultBytes;
while (resultBytes.size() < count && sleepIterations < 100)
{
if (socket->bytesAvailable() == 0)
{
sleepIterations++;
QThread::msleep(100);
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
continue;
}
resultBytes += socket->read(qMin(count, socket->bytesAvailable()));
}
return resultBytes;
}
Run Code Online (Sandbox Code Playgroud)
这应该等待字节可用于在套接字上读取,同时处理事件循环,因此套接字正在执行必要的内部操作。
不幸的是 - 由于我不知道的原因 -bytesAvailable()
有时会返回正确的字节数,但有时它永远不会返回大于 0 的任何内容。
我知道实际上有数据要读取,因为它曾经使用第二种方法(但它有自己的问题)。
第二:
我有一种信号“阻塞器”,它阻塞当前上下文并处理事件循环,直到发出某些信号。这是“拦截器”:
信号等待.h:
class SignalWait : public QObject
{
Q_OBJECT
public:
SignalWait(QObject *object, const char …
Run Code Online (Sandbox Code Playgroud) 我正在使用Android Studio 1.0.1.
我设法在项目中配置Android库模块,因此它内置于AAR中.
我的问题是AAR档案里面没有我的班级.当我检查时,MyProject/MyModule/build/intermediates/classes/debug/my/package/mymodule
我可以看到我的课程编译:MyClass.class
但是当我进入AAR(或解压缩它)时,同一个目录(我的意思是my/package/mymodule
在classes.jar
AAR文件里面)只包含一个文件:BuildConfig.class
为什么我的班级不包含在AAR中?