Java 和 C 中的字符串比较性能

     2023-04-13     265

关键词:

【中文标题】Java 和 C 中的字符串比较性能【英文标题】:String comparision performance in Java and C 【发布时间】:2015-10-08 02:46:26 【问题描述】:

我需要测量比较两个字符串的函数的性能。我的任务是用 Java 和 C 编写它并比较执行时间。出于测试目的,我生成了一个 txt 文件,其中包含 100000 个随机字符串,每个字符串从 100 到 200 个字符不等。使用它们我调用比较函数 20'000'000 次。在 Java 中需要约 500 毫秒,而在 C 中执行时间为 0 毫秒(我在两种语言中对完全相同的数据进行完全相同的测试)。即使我在 C 中将其增加到 20'000'000'000 次调用,它仍然测量 0 毫秒的持续时间。这怎么可能?我错过了什么重要的事情吗?

Java 实现

public class StringComparer 

    public static boolean compareStrings(String string1, String string2) 

        if(string1.length() != string2.length()) 
            return false;
        

        for (int i = 0; i < string1.length(); i++) 
            if(string1.charAt(i) != string2.charAt(i)) 
                return false;
            
        

        return true;
    

用 C 实现

bool string_compare(char* s1, char* s2)
   
    int i = 0;

    while (s1[i] != NULL && s1[i] == s2[i])
        i++;

    return s1[i] == s2[i];

这是我用来测试 C 性能的代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <windows.h>

#define NUMBER_OF_WORDS 100000
#define MAX_WORD_LENGTH 200

long long milliseconds_now() 
    static LARGE_INTEGER s_frequency;
    BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
    if (s_use_qpc) 
        LARGE_INTEGER now;
        QueryPerformanceCounter(&now);
        return (1000LL * now.QuadPart) / s_frequency.QuadPart;
    
    else 
        return GetTickCount();
    


int main()

    char* fileName = "tests.txt";
    FILE *file = fopen(fileName, "r");

    char* words[NUMBER_OF_WORDS];

    long long i, j;

    for (i = 0; i < NUMBER_OF_WORDS; i++) 
        words[i] = (char*)malloc((MAX_WORD_LENGTH + 1) * sizeof(char));
        fgets(words[i], MAX_WORD_LENGTH + 1, file);
    

    long long repeats = 10000000000 / NUMBER_OF_WORDS;

    long long start = milliseconds_now();

    for (i = 0; i < repeats; i++)
    
        for (j = 0; j < NUMBER_OF_WORDS - 1; j++)
        
            ;
        
    

    long long loopDuration = milliseconds_now() - start;

    start = milliseconds_now();

    for (i = 0; i < repeats; i++)
    
        for (j = 0; j < NUMBER_OF_WORDS - 1; j++)
        
            string_compare(words[j], words[j + 1]); //compare different strings
            string_compare(words[j], words[j]); //compare the same strings
        
    

    long long customFunctionDuration = milliseconds_now() - start;

    printf("Loop duration: %lld\n", loopDuration);
    printf("Custom function duration: %lld - %lld = %lld ms", customFunctionDuration, loopDuration, customFunctionDuration - loopDuration);

    return 0;

【问题讨论】:

【参考方案1】:

您的代码的可观察行为与根本不执行任何操作的代码完全相同。您需要将字符串比较的结果作为程序可观察行为的一部分,这样它们就不能优化为空。尝试统计字符串匹配的次数和字符串不匹配的次数并输出该数字。

【讨论】:

Android 和 Java 中的短裤

...】:2011-01-0821:18:38【问题描述】:我已经编写了一些使用字符串来表示时间的代码,例如“0620”,但经过仔细考虑后,我意识到可以将这些代码解析为用于比较性能和存储增益的短裤。在单元测试中,我有一个简短的写为0620与... 查看详情

使用交换和递归在 C 和 C++ 中的字符串反向性能

】使用交换和递归在C和C++中的字符串反向性能【英文标题】:StringreverseperformanceinC&C++usingswappingandrecursion【发布时间】:2015-07-1618:42:56【问题描述】:我正在练习我的C和C++技能,然后我决定使用两种语言中使用的方法来解决... 查看详情

性能比较

java里面的链表可以添加索引,而C中的链表,是没有索引的package ArrayListVSLinkedList;    import java.util.ArrayList;  import java.util.Date;  import java.util.LinkedL 查看详情

.NET与Java的子串运算性能比较

...ETandJava【发布时间】:2011-03-2907:45:56【问题描述】:获取字符串的子字符串是一种非常常见的字符串操作操作,但我听说Java和.NET平台之间的性能/实现可能存在相当大的差异。具体来说,我听说在Java中,java.lang.String为substring提... 查看详情

性能(JAVA)~ 循环中的字符串连接,带有前置和附加

】性能(JAVA)~循环中的字符串连接,带有前置和附加【英文标题】:Performance(JAVA)~Stringconcatenationinaloopwithprependingandappending【发布时间】:2017-04-1908:05:46【问题描述】:我遇到了性能问题。有没有人有更快/更好的解决方案来执... 查看详情

比较python和java/c中的for循环

】比较python和java/c中的for循环【英文标题】:compareforloopinpythonandinjava/c【发布时间】:2017-09-2621:52:28【问题描述】:我正在尝试将以下代码从Java转换为Python,这是输入:commonPrefix("","something"),//onestringis""commonPrefix("some","something"),... 查看详情

比较 c#、c++ 和 java 的性能(c# 的奇怪行为)

】比较c#、c++和java的性能(c#的奇怪行为)【英文标题】:Comparingc#,c++andjavaperformance(Strangebehaviorofc#)【发布时间】:2014-11-2216:26:39【问题描述】:我正在使用c++、c#和java实现Floyd–Warshall算法。在每种语言中,我在测试结果后都使... 查看详情

字符串比较和替换的 C++ 优化

】字符串比较和替换的C++优化【英文标题】:C++Optimizationforstringcompareandreplace【发布时间】:2015-05-0619:43:58【问题描述】:我正在尝试优化我编写的这个函数,它比较两个字符串,然后替换第一个字符串中的字符(如果在第二个... 查看详情

java编程思想-并发

性能调优通过前几篇的介绍,我们知道JDK1.5中的java.util.concurrent包中存在大量的辅助并用于提升性能的类。本文将着重讨论并比较这个包中的部分类之间的性能。比较各类互斥技术首先看看老式的同步机制synchronized关键字和JD... 查看详情

java数组和各种list的性能比较

以下程序分别对Java数组、ArrayList、LinkedList和Vector进行随机访问和迭代等操作,并比较这种集合的性能。packagecn.lion.test;publicclassPerformanceTest{privatestaticfinalintSIZE=100000;publicstaticabstractclassTest{privateStringoperation;pu 查看详情

比较Java中的字符

】比较Java中的字符【英文标题】:ComparingcharsinJava【发布时间】:2011-06-2909:46:06【问题描述】:我想检查一个char变量是21个特定字符之一,我能做到这一点的最短方法是什么?例如:if(symbol==(\'A\'|\'B\'|\'C\'))似乎没有工作。我需... 查看详情

python、c++、c#、java中字符串比较的区别

】python、c++、c#、java中字符串比较的区别【英文标题】:Differencesamongstringcomparisonsinpython,c++,c#andjava【发布时间】:2016-12-0619:14:41【问题描述】:似乎字符串比较不能简单地由“==”运算符完成,因为我从java和c#中的解释中读到:... 查看详情

将一行中的字符串与所有其他行中的相同字符串进行比较,并记录差异,pandes 的性能问题

】将一行中的字符串与所有其他行中的相同字符串进行比较,并记录差异,pandes的性能问题【英文标题】:Comparethestringinonerowtothesamestringinallotherrowsandregisterthedifference,performanceissueswithpandes【发布时间】:2020-12-0912:25:59【问题描述... 查看详情

转java5种字符串拼接方式性能比较。

最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试。 代码如下:import java.util.ArrayList;import java.util.List;import org.apache.commons.lang.StringUtils;import org.junit.Test;impor 查看详情

Scala 等与 C/C++/Fortran 的性能比较?

】Scala等与C/C++/Fortran的性能比较?【英文标题】:ComparisonofperformancebetweenScalaetc.andC/C++/Fortran?【发布时间】:2011-01-1822:52:24【问题描述】:我想知道“现代”多线程专业语言之间是否有可靠的性能比较,例如scala和“经典”“低... 查看详情

Android java比较xml字符串和edittext

】Androidjava比较xml字符串和edittext【英文标题】:Androidjavacomparexmlstringwithedittext【发布时间】:2020-12-1015:54:44【问题描述】:我想将xml字符串与来自edittextoder按钮的字符串进行比较。首先我设置按钮的文本:button1.setText(getString(R.s... 查看详情

java中的==和equals

...ble,char,boolean),并不包含String,所以不能用==来比较两个字符串相等。Strings1=newString("abc");Strings2="abc";System.o 查看详情

pandas中apply和transform方法的性能比较

...的差值函数等(注:apply不能直接使用agg()方法/transform()中的python内置函数,例如sum、m 查看详情