История изменений
Исправление Toxo2, (текущая версия) :
А сможете её распаралелить?
У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"sort"
)
type StringIntStruct struct {
k string
v int
}
type ArrayOfStringIntStruct []StringIntStruct
func (a ArrayOfStringIntStruct) Len() int { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }
func main() {
content, err := ioutil.ReadFile("huge.txt")
if err != nil {
log.Fatal(err)
}
map_words := make(map[string]int)
var word [1024]byte
w := 0
for _, c := range content {
c = c | 32
if c >= 'a' && c <= 'z' {
word[w] = c
w += 1
continue
}
if w > 0 {
map_words[string(word[0:w])] += 1
w = 0
}
}
count_words := len(map_words)
array_words := make(ArrayOfStringIntStruct, count_words)
w = 0
for k, v := range map_words {
array_words[w] = StringIntStruct{k, v}
w++
}
sort.Sort(array_words)
o, err := os.Create("out.txt")
if err != nil {
log.Fatal(err)
}
defer o.Close()
for _, v := range array_words {
fmt.Fprintln(o, v.v, v.k)
}
}
Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.
Исправление Toxo2, :
А сможете её распаралелить?
У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"sort"
)
type StringIntStruct struct {
k string
v int
}
type ArrayOfStringIntStruct []StringIntStruct
func (a ArrayOfStringIntStruct) Len() int { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }
func main() {
content, err := ioutil.ReadFile("huge.txt")
if err != nil {
log.Fatal(err)
}
map_words := make(map[string]int)
var word [1024]byte
w := 0
for _, c := range content {
c = c | 32
if c >= 'a' && c <= 'z' {
word[w] = c
w += 1
continue
}
if w > 0 {
map_words[string(word[0:w])] += 1
w = 0
}
}
count_words := len(map_words)
array_words := make(ArrayOfStringIntStruct, count_words)
w = 0
for k, v := range map_words {
array_words[w] = StringIntStruct{k, v}
w++
}
sort.Sort(array_words)
o, err := os.Create("out.txt")
if err != nil {
log.Fatal(err)
}
defer o.Close()
for _, v := range array_words {
fmt.Fprintln(o, v.v, v.k)
}
}
Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.
Исправление Toxo2, :
А сможете её распаралелить?
У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"sort"
)
type StringIntStruct struct {
k string
v int
}
type ArrayOfStringIntStruct []StringIntStruct
func (a ArrayOfStringIntStruct) Len() int { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }
func main() {
content, err := ioutil.ReadFile("huge.txt")
if err != nil {
log.Fatal(err)
}
map_words := make(map[string]int)
var word [1024]byte
w := 0
for _, c := range content {
c = c | 32
if c >= 'a' && c <= 'z' {
word[w] = c
w += 1
continue
}
if w > 0 {
map_words[string(word[0:w])] += 1
w = 0
}
}
count_words := len(map_words)
array_words := make(ArrayOfStringIntStruct, count_words)
w = 0
for k, v := range map_words {
array_words[w] = StringIntStruct{k, v}
w++
}
sort.Sort(array_words)
o, err := os.Create("out.txt")
if err != nil {
log.Fatal(err)
}
defer o.Close()
for _, v := range array_words {
fmt.Fprintln(o, v.v, v.k)
}
}
Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.
Исправление Toxo2, :
А сможете её распаралелить?
У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"sort"
)
type StringIntStruct struct {
k string
v int
}
type ArrayOfStringIntStruct []StringIntStruct
func (a ArrayOfStringIntStruct) Len() int { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }
func main() {
content, err := ioutil.ReadFile("huge.txt")
if err != nil {
log.Fatal(err)
}
map_words := make(map[string]int)
var word [1024]byte
w := 0
for _, c := range content {
c = c | 32
if c >= 'a' && c <= 'z' {
word[w] = c
w += 1
continue
}
if w > 0 {
map_words[string(word[0:w])] += 1
w = 0
}
}
count_words := len(map_words)
array_words := make(ArrayOfStringIntStruct, count_words)
w = 0
for k, v := range map_words {
array_words[w] = StringIntStruct{k, v}
w++
}
sort.Sort(array_words)
o, err := os.Create("out.txt")
if err != nil {
log.Fatal(err)
}
defer o.Close()
for _, v := range array_words {
fmt.Fprintln(o, v.v, v.k)
}
}
Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.
Исходная версия Toxo2, :
А сможете её распалелить?
У меня на Go примерно такое же с map, только без юникода - просто байты ASCII.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"sort"
)
type StringIntStruct struct {
k string
v int
}
type ArrayOfStringIntStruct []StringIntStruct
func (a ArrayOfStringIntStruct) Len() int { return len(a) }
func (a ArrayOfStringIntStruct) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ArrayOfStringIntStruct) Less(i, j int) bool { return a[i].v > a[j].v }
func main() {
content, err := ioutil.ReadFile("huge.txt")
if err != nil {
log.Fatal(err)
}
map_words := make(map[string]int)
var word [1024]byte
w := 0
for _, c := range content {
c = c | 32
if c >= 'a' && c <= 'z' {
word[w] = c
w += 1
continue
}
if w > 0 {
map_words[string(word[0:w])] += 1
w = 0
}
}
count_words := len(map_words)
array_words := make(ArrayOfStringIntStruct, count_words)
w = 0
for k, v := range map_words {
array_words[w] = StringIntStruct{k, v}
w++
}
sort.Sort(array_words)
o, err := os.Create("out.txt")
if err != nil {
log.Fatal(err)
}
defer o.Close()
for _, v := range array_words {
fmt.Fprintln(o, v.v, v.k)
}
}
Ну, так хоть в два раза быстрее варианта на php получилось, и то слава богу. Правда в два раза медленнее вариантов на c и c++.