new structure + serie 6
This commit is contained in:
5
src/06_optimization/Makefile
Normal file
5
src/06_optimization/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
DIRS=$(filter-out Makefile, $(wildcard *))
|
||||
|
||||
all clean install clean_all:
|
||||
for dir in $(DIRS); do $(MAKE) $@ -C $$dir; done
|
||||
|
||||
54
src/06_optimization/ex01/Makefile
Normal file
54
src/06_optimization/ex01/Makefile
Normal file
@@ -0,0 +1,54 @@
|
||||
EXE=ex1
|
||||
SRCS=$(wildcard *.c)
|
||||
|
||||
ifeq ($(target),)
|
||||
target=nano
|
||||
endif
|
||||
|
||||
CFLAGS=-Wall -Wextra -g -c -O1 -MD -std=gnu11 -D_GNU_SOURCE
|
||||
|
||||
ifeq ($(target),nano)
|
||||
TOOLCHAIN_PATH=/buildroot/output/host/usr/bin/
|
||||
TOOLCHAIN=$(TOOLCHAIN_PATH)aarch64-linux-
|
||||
CFLAGS+=-mcpu=cortex-a53 -funwind-tables
|
||||
CFLAGS+=-fno-omit-frame-pointer
|
||||
OBJDIR=.obj/nano
|
||||
EXEC=$(EXE)
|
||||
endif
|
||||
|
||||
ifeq ($(target),host)
|
||||
EXEC=$(EXE)_h
|
||||
endif
|
||||
|
||||
CC=$(TOOLCHAIN)gcc
|
||||
LD=$(TOOLCHAIN)gcc
|
||||
AR=$(TOOLCHAIN)ar
|
||||
STRIP=$(TOOLCHAIN)strip
|
||||
OBJDUMP=$(TOOLCHAIN)objdump
|
||||
|
||||
OBJDIR=.obj/$(target)
|
||||
OBJS= $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))
|
||||
|
||||
$(OBJDIR)/%o: %c
|
||||
$(CC) $(CFLAGS) $< -o $@
|
||||
|
||||
all: $(OBJDIR)/ $(EXEC)
|
||||
|
||||
$(EXEC): $(OBJS) $(LINKER_SCRIPT)
|
||||
$(LD) $(OBJS) $(LDFLAGS) -o $@
|
||||
|
||||
$(OBJDIR)/:
|
||||
mkdir -p $(OBJDIR)
|
||||
|
||||
clean:
|
||||
rm -Rf $(OBJDIR) $(EXEC) $(EXEC)_s *~ t.txt
|
||||
|
||||
clean_all: clean
|
||||
rm -Rf .obj $(EXE) $(EXE)_s $(EXE)_a $(EXE)_a_s $(EXE)_h $(EXE)_h_s
|
||||
|
||||
dump: all
|
||||
$(OBJDUMP) -dS $(EXEC) > t.txt
|
||||
|
||||
-include $(OBJS:.o=.d)
|
||||
|
||||
.PHONY: all clean clean_all dump
|
||||
23
src/06_optimization/ex01/main.c
Normal file
23
src/06_optimization/ex01/main.c
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#define SIZE 5000
|
||||
|
||||
static int32_t array[SIZE][SIZE];
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int i, j, k;
|
||||
|
||||
for (k = 0; k < 10; k++)
|
||||
{
|
||||
for (i = 0; i < SIZE; i++)
|
||||
{
|
||||
for (j = 0; j < SIZE; j++)
|
||||
{
|
||||
array[j][i]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
54
src/06_optimization/ex02/Makefile
Normal file
54
src/06_optimization/ex02/Makefile
Normal file
@@ -0,0 +1,54 @@
|
||||
EXE=ex2
|
||||
SRCS=$(wildcard *.c)
|
||||
|
||||
ifeq ($(target),)
|
||||
target=nano
|
||||
endif
|
||||
|
||||
CFLAGS=-Wall -Wextra -g -c -O0 -MD -std=gnu11 -D_GNU_SOURCE
|
||||
|
||||
ifeq ($(target),nano)
|
||||
TOOLCHAIN_PATH=/buildroot/output/host/usr/bin/
|
||||
TOOLCHAIN=$(TOOLCHAIN_PATH)aarch64-linux-
|
||||
CFLAGS+=-mcpu=cortex-a53 -funwind-tables -fno-omit-frame-pointer
|
||||
##CFLAGS+=-O2
|
||||
OBJDIR=.obj/nano
|
||||
EXEC=$(EXE)
|
||||
endif
|
||||
|
||||
ifeq ($(target),host)
|
||||
EXEC=$(EXE)_h
|
||||
endif
|
||||
|
||||
CC=$(TOOLCHAIN)gcc
|
||||
LD=$(TOOLCHAIN)gcc
|
||||
AR=$(TOOLCHAIN)ar
|
||||
STRIP=$(TOOLCHAIN)strip
|
||||
OBJDUMP=$(TOOLCHAIN)objdump
|
||||
|
||||
OBJDIR=.obj/$(target)
|
||||
OBJS= $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))
|
||||
|
||||
$(OBJDIR)/%o: %c
|
||||
$(CC) $(CFLAGS) $< -o $@
|
||||
|
||||
all: $(OBJDIR)/ $(EXEC)
|
||||
|
||||
$(EXEC): $(OBJS) $(LINKER_SCRIPT)
|
||||
$(LD) $(OBJS) $(LDFLAGS) -o $@
|
||||
|
||||
$(OBJDIR)/:
|
||||
mkdir -p $(OBJDIR)
|
||||
|
||||
clean:
|
||||
rm -Rf $(OBJDIR) $(EXEC) $(EXEC)_s *~ t.txt
|
||||
|
||||
clean_all: clean
|
||||
rm -Rf .obj $(EXE) $(EXE)_s $(EXE)_a $(EXE)_a_s $(EXE)_h $(EXE)_h_s
|
||||
|
||||
dump: all
|
||||
$(OBJDUMP) -dS $(EXEC) > t.txt
|
||||
|
||||
-include $(OBJS:.o=.d)
|
||||
|
||||
.PHONY: all clean clean_all dump
|
||||
24
src/06_optimization/ex02/main.c
Normal file
24
src/06_optimization/ex02/main.c
Normal file
@@ -0,0 +1,24 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define SIZE 65536
|
||||
|
||||
int main()
|
||||
{
|
||||
// generate data
|
||||
short data[SIZE];
|
||||
for (int i = 0; i < SIZE; i++) {
|
||||
data[i] = rand() % 512;
|
||||
}
|
||||
|
||||
|
||||
long long sum = 0;
|
||||
for (int j = 0; j < 10000; j++) {
|
||||
for (int i = 0; i < SIZE; i++) {
|
||||
if (data[i] >= 256) {
|
||||
sum += data[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
printf ("sum=%lld\n", sum);
|
||||
}
|
||||
37
src/06_optimization/ex03/ApacheAccessLogAnalyzer.cpp
Normal file
37
src/06_optimization/ex03/ApacheAccessLogAnalyzer.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#include "ApacheAccessLogAnalyzer.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
ApacheAccessLogAnalyzer::ApacheAccessLogAnalyzer(std::string filename)
|
||||
: myFilename(filename)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ApacheAccessLogAnalyzer::openFile()
|
||||
{
|
||||
myInFile.open(myFilename.c_str());
|
||||
}
|
||||
|
||||
void ApacheAccessLogAnalyzer::closeFile()
|
||||
{
|
||||
myInFile.close();
|
||||
}
|
||||
|
||||
void ApacheAccessLogAnalyzer::processFile()
|
||||
{
|
||||
std::cout << "Processing log file " << myFilename << std::endl;
|
||||
for( std::string line; getline( myInFile, line ); )
|
||||
{
|
||||
// parse the log line to extract the hostname / ip address
|
||||
int space_pos = line.find_first_of(" ");
|
||||
std::string hostname = line.substr(0, space_pos);
|
||||
|
||||
myHostCounter.notifyHost(hostname);
|
||||
}
|
||||
|
||||
std::cout << "Found " << myHostCounter.getNbOfHosts() << " unique Hosts/IPs" << std::endl;
|
||||
}
|
||||
20
src/06_optimization/ex03/ApacheAccessLogAnalyzer.h
Normal file
20
src/06_optimization/ex03/ApacheAccessLogAnalyzer.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#include "HostCounter.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
|
||||
class ApacheAccessLogAnalyzer
|
||||
{
|
||||
public:
|
||||
ApacheAccessLogAnalyzer(std::string filename);
|
||||
|
||||
void openFile();
|
||||
void closeFile();
|
||||
void processFile();
|
||||
|
||||
private:
|
||||
std::string myFilename;
|
||||
std::ifstream myInFile;
|
||||
HostCounter myHostCounter;
|
||||
};
|
||||
26
src/06_optimization/ex03/HostCounter.cpp
Normal file
26
src/06_optimization/ex03/HostCounter.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "HostCounter.h"
|
||||
|
||||
#include <algorithm> // for std::find
|
||||
|
||||
HostCounter::HostCounter()
|
||||
{
|
||||
}
|
||||
|
||||
bool HostCounter::isNewHost(std::string hostname)
|
||||
{
|
||||
return std::find(myHosts.begin(), myHosts.end(), hostname) == myHosts.end();
|
||||
}
|
||||
|
||||
void HostCounter::notifyHost(std::string hostname)
|
||||
{
|
||||
// add the host in the list if not already in
|
||||
if(isNewHost(hostname))
|
||||
{
|
||||
myHosts.push_back(hostname);
|
||||
}
|
||||
}
|
||||
|
||||
int HostCounter::getNbOfHosts()
|
||||
{
|
||||
return myHosts.size();
|
||||
}
|
||||
22
src/06_optimization/ex03/HostCounter.h
Normal file
22
src/06_optimization/ex03/HostCounter.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#include <string>
|
||||
|
||||
#include <vector>
|
||||
|
||||
class HostCounter
|
||||
{
|
||||
public:
|
||||
HostCounter();
|
||||
|
||||
// Announce a host to the HostCounter.
|
||||
// if the host is new, it will be added to the list, otherwise we ignore it.
|
||||
void notifyHost(std::string hostname);
|
||||
|
||||
// return the number of unique hosts found so far
|
||||
int getNbOfHosts();
|
||||
|
||||
private:
|
||||
// check if host is already in the list
|
||||
bool isNewHost(std::string hostname);
|
||||
|
||||
std::vector< std::string > myHosts;
|
||||
};
|
||||
30
src/06_optimization/ex03/Makefile
Normal file
30
src/06_optimization/ex03/Makefile
Normal file
@@ -0,0 +1,30 @@
|
||||
##CXX?=g++
|
||||
##CXXFLAGS=-Wall -Wextra -g -O0 -MD
|
||||
|
||||
TOOLCHAIN_PATH=/buildroot/output/host/usr/bin/
|
||||
TOOLCHAIN=$(TOOLCHAIN_PATH)aarch64-linux-
|
||||
CXX=$(TOOLCHAIN)g++
|
||||
CXXFLAGS=-Wall -Wextra -g -gdwarf -O0 -MD -mcpu=cortex-a53 -fno-omit-frame-pointer -funwind-tables
|
||||
|
||||
SOURCES=$(wildcard *.cpp)
|
||||
OBJECTS=$(SOURCES:.cpp=.o)
|
||||
EXECUTABLE=read-apache-logs
|
||||
|
||||
all: $(SOURCES) $(EXECUTABLE)
|
||||
|
||||
$(EXECUTABLE): $(OBJECTS)
|
||||
$(CXX) $(CXXFLAGS) -o $@ $(OBJECTS)
|
||||
|
||||
.c.o:
|
||||
$(CXX) -c $(CXXFLAGS) $< -o $@
|
||||
|
||||
|
||||
clean:
|
||||
@rm -f $(OBJECTS)
|
||||
@rm -f *.d *~
|
||||
|
||||
clean_all: clean
|
||||
@rm -f $(EXECUTABLE)
|
||||
@rm -f perf.data perf.data.old
|
||||
|
||||
-include *.d
|
||||
30
src/06_optimization/ex03/main.cpp
Normal file
30
src/06_optimization/ex03/main.cpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#include "ApacheAccessLogAnalyzer.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
// forward declaration
|
||||
void usage(const char* progName);
|
||||
|
||||
int main(int argc, const char* argv[])
|
||||
{
|
||||
if(argc != 2)
|
||||
{
|
||||
usage(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string filename = argv[1];
|
||||
|
||||
ApacheAccessLogAnalyzer analyzer(filename);
|
||||
|
||||
analyzer.openFile();
|
||||
analyzer.processFile();
|
||||
analyzer.closeFile();
|
||||
}
|
||||
|
||||
|
||||
void usage(const char* progName)
|
||||
{
|
||||
std::cout << "Usage: " << progName << " <filename>" << std::endl;
|
||||
std::cout << "\nWhere <filename> is the apache access log file" << std::endl;
|
||||
}
|
||||
Reference in New Issue
Block a user