Gå til innhold

Hvordan finne forskjeller i større datalister, rasktest mulig?


Anbefalte innlegg

Videoannonse
Annonse

Dataene er sortert, sa du?

 

$ time ./a.out

> /home/olav/Documents/103375239.doc

< /home/olav/Documents/gameofthrones.doc

< /home/olav/Documents/.hiddenpornofiles/nudepic1.jpg

< /home/olav/Documents/.hiddenpornofiles/nudepic2.jpg

< /home/olav/Documents/.hiddenpornofiles/nudepic3.jpg

< /home/olav/Documents/.hiddenpornofiles/nudepic4.jpg

< /home/olav/Documents/porn.doc

> /home/olav/file753898663.txt

> /home/olav/file75400904.txt

> /home/olav/file75535687.txt

> /home/olav/file755566055.txt

> /home/olav/file75574336.txt

< /home/olav/Music

< /home/olav/Pictures

< /home/olav/.profile.conf

< /home/olav/raid

< /home/olav/.ssh/id_pub.rsa

< /usr/local/etc/989929161.conf

< /usr/local/etc/98994238.conf

< /usr/local/etc/989950314.conf

< /usr/local/etc/99962676.conf

< /usr/local/etc/nginx.conf

< /usr/local/etc/postgresql.conf

< /usr/local/etc/smb.conf

 

real 0m0.083s

user 0m0.068s

sys 0m0.012s

 

Inkludert innlesning. Er et par antagelser jeg ikke kan gjøre, så blir noen sjekker for mye. Men men. Mistenker at mesteparten her sitter i IO.

 

#include <fstream>
#include <iostream>

static inline void helper( std::ifstream& file1,
	std::ifstream& file2,
	std::string& line1,
	std::string&line2, bool right ) {

const char* arrow = right ? "> " : "< ";
while( line1 < line2 && file1.good() ) {
	std::cout << arrow << line1 << "\n";
	std::getline( file1, line1 );
}  

if( line1 == line2 ) return;

if( !file1.good() ) return;
helper( file2, file1, line2, line1, !right );
}

int main() {
std::string line1, line2;
std::cout.sync_with_stdio( false );
std::ifstream file1( "data5.txt" );
std::ifstream file2( "data6.txt" );

while( file1.good() && file2.good() ) {
	std::getline( file1, line1 );
	std::getline( file2, line2 );

	if( line1 == line2 ) continue;
	if( line1 < line2 )
		helper( file1, file2, line1, line2, true );
	else helper( file2, file1, line2, line1, false );
}  

while( file1.good() ) {
	std::cout << "> " << line1 << "\n";
	getline( file1, line1 );
}  

while( file2.good() ) {
	std::cout << "< " << line2 << "\n";
	getline( file2, line2 );
}  

std::cout.flush();
}

 

Veldig nice Lycantrophe!

Testa den nettopp her, 5x raskare enn Python og det inkludert innlesning! :)

+ For veldig lettlest kode også!

 

Sånt som det der får meg til å misunne folk som kan C eller C++.

Lenke til kommentar
Gjest Slettet+9871234

Sånt som det der får meg til å misunne folk som kan C eller C++.

 

Viktigst i prioritert rekkefølge:

  1. Algoritmer og datastrukturer.
  2. Maskinvare.
  3. Språk, tolket kontra kompilert kode.

Etter mitt syn gir det liten mening - ceteris paribus - å sammenligne tolket med kompilert kode. Det er fint at der er noen her inne som ikke er blinde og kan C :hmm:

Lenke til kommentar

Konverterte koden til Lycantrophe til Java. Blei ca 50% treigare etter 20 looper som varma opp JVM'en.

Tipper det er compareTo() og equals() som drar ned ytelsen.

 

package no.diskusjon;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
public class Main {
   private static void helper(BufferedReader br1, BufferedReader br2,
				    String line1, String line2, boolean right)
    throws IOException{
    String arrow = right ? "> " : "< ";
    while(line1.compareTo(line2) < line2.compareTo(line1)){
	    System.out.println(arrow+line1+"\n");
	    line1 = br1.readLine();
    }
    if(line1.equals(line2)) {
	    return;
    }
    helper(br2, br1, line2, line1, !right);
   }
   public static long start(){
    final File file1 = new File("/home/olav/Downloads/data5.txt");
    final File file2 = new File("/home/olav/Downloads/data6.txt");
    String line1;
    String line2;
    try{
	    BufferedReader br1 = new BufferedReader(new FileReader(file1));
	    BufferedReader br2 = new BufferedReader(new FileReader(file2));
	    long start = new Date().getTime();
	    while(((line1 = br1.readLine()) != null) &&
			    (line2 = br2.readLine()) != null){
		    if(line1.equals(line2)) {
			    continue;
		    }
		    else if( line1.compareTo(line2) < line2.compareTo(line1) ){
			    helper(br1, br2, line1, line2, true);
		    }
		    else{
			    helper(br2, br1, line2, line1, false);
		    }
	    }
	    while ((line1 = br1.readLine()) != null){
		    System.out.println("> " + line1 + "\n");
	    }
	    while ((line2 = br2.readLine()) != null){
		    System.out.println("< " + line2 + "\n");
	    }
	    return new Date().getTime() - start;
    } catch(IOException e){
	    return -1l;
    }
   }
   public static void main(String[] args) {
    long ms = -1;
    for(int i = 0; i < 20; i++){
	    ms = start();
    }
    System.out.println(ms);
   }
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...