- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 104k 个字符串值,其中 89k 个是唯一的。我想检查这个列表中是否存在一个字符串。
这是我的类及其保存所有这些记录的方法。
public class TestClass {
private static TestClass singletonObj = null;
private List<String> stringList= null;
public static synchronized TestClass getInstance() {
if(singletonObj == null) {
singletonObj = new TestClass();
}
return singletonObj;
}
public boolean isValidString(String token) {
if(stringList == null) {
init();
}
if(stringList != null && token != null && !token.isEmpty())
return stringList.contains(token.toLowerCase());
return false;
}
private init() {
stringList = new ArrayList<String>();
// put all 104k values in this data structure.
}
}
我的应用程序尝试同时使用此 isValidString()
方法,每秒大约有 20 个请求。这工作正常,但是当我尝试将数据结构更改为 HashSet
时,CPU 使用率非常高。根据我的理解,Hashset 应该比 ArrayList[o(n)] 表现得更好[o(1)]。任何人都可以向我解释为什么会这样吗?
最佳答案
我创建了一个简单的类来生成 20 个线程,按照这篇文章的底部每秒访问您的字典检查器。
我无法复制您的结果 - 但这可能是因为我有权访问输入数据。我使用了您的 TestClass
实现,从英语开放单词列表 (EOWL) 中导入了约 130,000 个单词。对于 ArrayList
或 HashSet
作为 stringList
的类型,没有看到持续的高 CPU 使用率。
我的猜测是您的问题是由于您的输入数据造成的。我尝试添加我的输入字典两次以创建重复 - 显然使用 ArrayList
这只会使列表长两倍,但是使用 HashSet
,这意味着代码被抛出重复。您注意到大约 1/5 的输入数据是重复的。在我的测试中有 1/2 的重复项,我确实看到 轻微 CPU 增加了大约 2 秒,然后在 stringList
已初始化。
如果您输入的字符串比我使用的单个单词更复杂,这个“信号”可能会持续更长时间。所以也许那是你的问题。或者 - 也许您有一些其他代码来包装这部分占用 CPU 的部分。
N.B. 我会提醒您,因为其他人在对您的 init
实现发表评论时。在我的实验中,我看到许多线程可以在字典完全初始化之前调用字典检查,从而为相同的测试单词提供不一致的结果。如果它是一个单例对象,为什么不从你的构造函数中调用它呢?
带有一些输入数据代码的测试类:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
public class TestClass {
private static TestClass singletonObj = null;
//private List<String> stringList = null;
private HashSet<String> stringList = null;
public static synchronized TestClass getInstance() {
if (singletonObj == null) {
singletonObj = new TestClass();
}
return singletonObj;
}
public boolean isValidString(String token) {
if (stringList == null) {
init();
}
if (stringList != null && token != null && !token.isEmpty())
return stringList.contains(token.toLowerCase());
return false;
}
private void init() {
String dictDir = "C:\\Users\\Richard\\Documents\\EOWL_CSVs";
File[] csvs = (new File(dictDir)).listFiles();
stringList = new HashSet<String>();
Scanner inFile = null;
for (File f : csvs) {
try {
inFile = new Scanner(new FileReader(f));
} catch (FileNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
while (inFile.hasNext()) {
stringList.add(inFile.next().toLowerCase()
.replaceAll("[^a-zA-Z ]", ""));
}
inFile.close();
}
System.out.println("Dictionary initialised with " + stringList.size()
+ " members");
}
}
访问它的线程:
import java.io.FileNotFoundException;
public class DictChecker extends Thread {
TestClass t = null;
public static int classId = 0;
String className = null;
public void doWork()
{
String testString = "Baby";
if (t.isValidString(testString))
{
System.out.println("Got a valid string " + testString + " in class " + className);
}
else
{
System.out.println(testString + " not in the dictionary");
}
}
public void run()
{
while (true)
{
try {
DictChecker.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
doWork();
}
}
public DictChecker()
{
t = TestClass.getInstance();
className = "dChecker" + classId;
classId += 1;
System.out.println("Initialised " + className + " in thread " + this.getName());
}
public static void main(String[] args) throws FileNotFoundException
{
for (int i = 0; i < 20; i++)
{
(new DictChecker()).start();
try {
DictChecker.sleep(50);//simply to distribute load over the second
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
关于java - HashSet vs ArrayList CPU 使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31850073/
我们有一个 SQL 服务器,其中包含大约 40 个不同的数据库(每个数据库大约 1-5GB)。该服务器是8核2.3G CPU和32Gigs RAM。 27Gig 固定到 SQL Server。 CPU
我通过创建一个简单的循环并在数组中添加元素来测试 Java 8 并行流 API 的性能。 与非并行相比,我获得了巨大的性能提升。 但是当我检查我的任务管理器时,我看到了一个不受控制的 CPU 使用率,
我在使用 JFX 应用程序时遇到了一些问题。在我的本地开发系统(Linux)上,我的应用程序的 CPU 使用率约为 0-2%。当我在客户 Windows 虚拟机系统上安装并运行我的应用程序时,CPU
我在 unix 上工作。我想知道进程当前的 cpu 使用情况。我知道 ps 给出了在进程启动之前使用的 cpu 平均值 - 这不是当前使用情况。 有没有办法从 top 命令只打印 cpu 而无需 10
我尝试对许多文件进行哈希处理,但它没有使用满 CPU 能力。它只消耗25%。我测试将繁重的进程移动到线程中。但仍然没有什么不同。我来自 nodejs 使用 sharp 库。有同样的任务。它消耗所有的C
有没有办法在 CentOS 中获取 CPU 使用率?我需要解析这些信息并将其从 Perl 脚本中绘制出来,因此它最好是一个简单的工具,可以打印出一个单一的输出。 最佳答案 更简单,看/proc/loa
早上好。 目前我正在 Ubuntu 服务器 11.10 中运行 Java Web 应用程序。对于我的 Java 应用程序,我使用的是 apache、tomcat 和 mysql。 在过去的几周里,我的
我想做的事 我有一个计算密集型 OCaml 应用程序,我希望它在后台运行而不影响正常的计算机使用。我想为用户提供两个选项: (1) 应用程序仅在 CPU 使用率几乎为 0% 时运行; (2) 应用程序
我使用Couchdb创建了一个私有(private)NPM镜像,但我发现beam.smp将我的 CPU 使用率保持在 100%,有没有办法降低它,比如 50%? 非常感谢你。 最佳答案 您不能直接限制
我正在 docker 容器内构建一个项目,在创建容器时没有任何资源限制。当我监控它时,我看到了不同的 CPU 使用率结果。 来自 ctop 来自 Grafana(全节点导出器图表) 来自 cAdvis
我需要在 Web 开发编码 session 期间收集有关 Firefox CPU 使用率的数据,我想知道是否可以监视特定 firefox 插件的 CPU 使用率。 现在我正在使用 windows 的
R 是单线程的。 使用 R,如何检查 Windows 和 Linux 中有多少内核/线程正在运行 R? (或运行了多少卢比) 使用 R,如何检查 Windows 和 Linux 中运行 R 的每个内核
我正在尝试像示例中那样测试 Kubernetes HPA here kubectl run php-apache --image=gcr.io/google_containers/hpa-exampl
在我们的办公室,我们有一个开发服务器:Win 2k8 server R2 - Coldfusion 9(.0.0) - MySQL 5 ... 几乎每天早上上类时,我都会发现服务器的 CPU 为 50
我有一组 cpu 消耗执行,每个执行都在低优先级的线程中运行。这些线程将在一个进程(如 IIS)中运行,该进程具有许多我不想减慢它们速度的其他线程。我想计算所有其他线程的 cpu 使用率,如果它大于
我是 azure 云的新手,我已经部署了我的第一个辅助角色。 在我的本地系统中需要 30 分钟才能完成的过程在 azure 辅助角色上需要 1 个多小时。 为了查找问题,我已访问辅助角色的远程桌面。我
这是我的测试 boost::tribool 示例: #include #include "boost/logic/tribool.hpp" int main() { boost::logic::tr
我正在使用 docker 远程 API 来检索正在运行的容器的统计信息。对于 CPU 使用情况,我得到的例子是: "cpu_stats": { "cpu_usage": { "to
我是 azure 云的新手,我已经部署了我的第一个辅助角色。 在我的本地系统中需要 30 分钟才能完成的过程在 azure 辅助角色上需要 1 个多小时。 为了查找问题,我已访问辅助角色的远程桌面。我
我知道意外的无限循环通常会导致 CPU 使用率较高。但是,我不太明白为什么。谁能给我解释一下吗? 最佳答案 CPU 在执行该循环(永远不会结束)时无法执行任何其他操作。即使您使用的是抢占式多任务系统(
我是一名优秀的程序员,十分优秀!