关键词:
【中文标题】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 查看详情