java操作xml运行速度慢?为啥呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java操作xml运行速度慢?为啥呢?相关的知识,希望对你有一定的参考价值。

我最近写了一排课算法!是用dom4j包操作xml,用xml存储数据,发现在排课的时候好慢,我排一个班级差不多就一分钟了.若一个学校60个班就要一个小时了,这样老师是肯定等不来的...

请各位有经验之士发表下高见,难道是我的算法复杂呢?我觉得也并不复杂!
贴上源码!你们也没精神来看的!

贴不上去.?

看来还是得少操作xml文件,每操作一次就增加了运行时间

不会吧
我从saxReader = new SAXReader();到读取打印结束也不到1秒啊
读取的源码贴出来
或者QQ:25111337
参考技术A dom本来就慢
它好像是读一行解析一行
参考技术B 怎么写的 把源程序贴上来

有人可以解释为啥使用 OpenMP 部分的运行速度比单线程慢吗?

【中文标题】有人可以解释为啥使用 OpenMP 部分的运行速度比单线程慢吗?【英文标题】:Can someone explain why using OpenMP sections run slower than a single thread?有人可以解释为什么使用 OpenMP 部分的运行速度比单线程慢吗? 【发布时间】:2017-08-23 20:18:31 【问题描述】:

我是并行编程的新手。 根据示例代码,有人可以解释为什么使用 OpenMP 部分的运行速度比单线程慢吗?有什么改进的建议吗?

#include<iostream>
#include <vector>
#include <chrono>
#include <numeric>
#include<omp.h>

using namespace std;

int Calculation_1(int A, int B);
int Calculation_2(int A, int B);
int Calculation_3(int A, int B);
int Calculation_4(int A, int B);

int main() 

vector<int>W;
vector<int>X;
vector<int>Y;
vector<int>Z;

chrono::steady_clock::time_point begin1 = std::chrono::steady_clock::now();
    omp_set_num_threads(4);

    #pragma omp parallel
    
    #pragma omp sections nowait
        
        #pragma omp section
            
                W.push_back(Calculation_1(5, 5));
            
        #pragma omp section
            
                X.push_back(Calculation_2(5, 5));
            
        #pragma omp section
            
                Y.push_back(Calculation_3(5, 5));
            
        #pragma omp section
            
                Z.push_back(Calculation_4(5, 5));
            
        
    

cout << "Parallel = " << accumulate(W.begin(), W.end(), 0) + accumulate(X.begin(), X.end(), 0) + accumulate(Y.begin(), Y.end(), 0) + accumulate(Z.begin(), Z.end(), 0) << endl;;
chrono::steady_clock::time_point end1 = std::chrono::steady_clock::now();
cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - begin1).count() << std::endl;
//Clear vector
W.clear();
X.clear();
Y.clear();
Z.clear();

////Sigle
chrono::steady_clock::time_point begin2 = std::chrono::steady_clock::now();

    W.push_back(Calculation_1(5, 5));
    X.push_back(Calculation_2(5, 5));
    Y.push_back(Calculation_3(5, 5));
    Z.push_back(Calculation_4(5, 5));

cout << "single = " << accumulate(W.begin(), W.end(), 0) + accumulate(X.begin(), X.end(), 0) + accumulate(Y.begin(), Y.end(), 0) + accumulate(Z.begin(), Z.end(), 0) << endl;
chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - begin2).count() << std::endl;

cin.get();

return 0;



int Calculation_1(int A, int B) 
    return A + B;

int Calculation_2(int A, int B) 
    return A + B;

int Calculation_3(int A, int B) 
    return A + B;

int Calculation_4(int A, int B) 
    return A + B;

结果是: 并行 = 40 时间 = 9168172

单人 = 40 时间225580

并行的比单一的慢 40 倍。

//我也尝试根据建议将许多数字推入向量中(代码如下)。结果是:(并行的比单一的慢9倍。)。

平行 时间 = 12907862

单人 时间 = 1334519

chrono::steady_clock::time_point begin1 = std::chrono::steady_clock::now();
    omp_set_num_threads(2);

    #pragma omp parallel
    
    #pragma omp sections nowait
        
        #pragma omp section
            
                for (int i = 0; i < 100000; i++) 
                    X.push_back(i);
                
            
        #pragma omp section
            
                for (int j = 0; j < 100000; j++) 
                    Y.push_back(j);
                
            
        
    

cout << "Parallel = " << accumulate(X.begin(), X.end(), 0) + accumulate(Y.begin(), Y.end(), 0) << endl;;
chrono::steady_clock::time_point end1 = std::chrono::steady_clock::now();
cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - begin1).count() << std::endl;
//Clear vector
X.clear();
Y.clear();

////Sigle
chrono::steady_clock::time_point begin2 = std::chrono::steady_clock::now();

for (int i = 0; i < 100000; i++) 
    X.push_back(i);

for (int j = 0; j < 100000; j++) 
    Y.push_back(j);



cout << "single = " << accumulate(X.begin(), X.end(), 0) + accumulate(Y.begin(), Y.end(), 0) << endl;
chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - begin2).count() << std::endl;

非常感谢,

【问题讨论】:

您的目标环境中有多少个内核可用?除非你有不同的 CPU 内核来处理它们,否则向线程扔东西并不会让它们神奇地更快。 启动线程是有代价的。你看到的就是这个成本。尝试添加循环以将许多项添加到向量中,看看效果如何,而不是添加单个项(这会浪费线程) @Nathan 这应该是一个答案。如果 OP 进一步澄清他们的目标,让我们稍等一下。 让您的计算不仅仅是一个可能已经优化的加法。创建线程的成本远高于您在线程中执行的操作。 【参考方案1】:

还要注意,对于这种简单的计算,向线程发送垃圾邮件 的时间成本可能比仅在单个线程中计算它们的成本更大。 同样正如 user0042 所说,如果您的计算机垃圾邮件多于内核,他们将开始调度资源(内核)并共享它们,进入和退出也会减慢计算。

【讨论】:

【参考方案2】:

真正并行计算事物(运行彼此独立的线程),您需要有与线程相关联的专用 CPU 内核。

如果您的线程数多于可用的 CPU 内核数,您只会引入有关线程创建和调度的开销。这很可能是您的代码变慢的原因。

【讨论】:

您可以添加一些并行效率图来演示。 @Mel 好吧,不:-D。随意自己做(编辑我的答案或发布你自己的)。 哈哈也许明天! :)

以上是关于java操作xml运行速度慢?为啥呢?的主要内容,如果未能解决你的问题,请参考以下文章

excel版本越高VBA运行速度越慢,为啥?

为啥此 SIMD 代码运行速度比等效标量慢?

为啥 OMP 任务运行速度比 OMP 慢?

为啥我的机器运行速度超级慢?正常情况下都有那些进程启动项视该保留的?

下载速度的关键在哪?为啥我家下载这么慢?

excel版本越高VBA运行速度越慢,为啥?